April 2007 - Posts

Looking Forward to Window Clippings 2.0: Image Effects

Update: Window Clippings 2.0 is now available! Download it now from http://www.windowclippings.com/.

 

Continuing my look at some of the highlights in the upcoming Window Clippings 2.0 release, today I want to introduce some new image effects that I’ve introduced. Window Clippings 1.5 supported just two effects namely “Clear window background” and “Include window shadow”. Version 2.0 introduces four brand new effects that you can take advantage of to create more impactful screenshots. Here’s what the new Image tab looks like:

Include mouse pointer

A number of users emailed and left comments indicating that this would be a very valuable feature for them. Window Clippings 2.0 can capture both traditional icon-style cursors as well as the new Vista alpha channel based cursors:

Allow object selection

I’ve already shared some of the selection features. This option enables you to select individual controls in a window. By default, clicking anywhere within a window will select the window frame. With this option you can select one or more controls. In this example I selected the group box:

Freeze window during capture

Window Clippings 1.5 introduced the ability to capture the transparency provided by desktop composition on Windows Vista. One of the limitations in version 1.5 was that any animation in the window removed the ability to capture this alpha channel. Well no longer. This option very briefly freezes drawing to the window to allow Window Clippings to perfectly capture the alpha channel for animated windows. Here’s an example of a marquee progress bar which is highly animated. Keep in mind that this only works for traditional GDI applications (still the majority of applications) and should not be used with applications that rely directly or indirectly on DirectX. Examples include WPF apps and Windows Media Center. I was hesitant to add a feature that would only work with a subset of applications but user feedback convinced me that it would still be useful to many people.

Delay before capture

Finally, this option allows you to interact with the selected windows prior to capturing the image. This allows you to produce various effects such as button hover highlighting, display popup balloons, open menus, etc. I’ve already highlighted some of the effects that are possible but here’s another quick look:

Stay tuned for more highlights from the upcoming Window Clippings 2.0!

© 2007 Kenny Kerr

Posted by KennyKerr with 3 comment(s)
Filed under:

Looking Forward to Window Clippings 2.0: Add-In Development

Update: Window Clippings 2.0 is now available! Download it now from http://www.windowclippings.com/.

 

Previously I introduced the concept of add-ins for Window Clippings from the user’s perspective. Today I want to talk about what it takes to develop an add-in.

Arguably the concept of an add-in has been around for a very long time. In modern computing, applications can be considered add-ins to the operating system. Many well-established applications like Internet Explorer, Firefox, Microsoft Office, etc. all support add-ins of some kind. As far as platforms go, COM provides a great foundation for developing add-ins and more recently the upcoming release of the .NET Framework is finally introducing plumbing to simplify extensibility for managed applications.

There are many considerations when designing extensibility into a product. Naturally the nature and design of a given product plays a part in shaping what can be done with add-ins and how they might be exposed or integrated. Window Clippings is a native Windows application that does not rely on the .NET Framework so naturally supporting add-ins developed with native code is important. Equally obvious is support for add-ins developed using managed code since many users will want to be able to whip up a quick add-in using their favorite .NET-supporting compiler.

Based on these scenarios and constraints I devised an extensibility model that allows add-ins to be developed in either native C++ using COM or using purely managed code using your favorite .NET compiler. Both native and managed add-ins are first-class add-ins and both receive the same treatment from Window Clippings as far as integration and feature support goes. Window Clippings also starts as a native application but will load the CLR on demand in the event that any managed add-ins are being used. You can of course continue to use Window Clippings on platforms that may not have the .NET Framework installed such as Windows XP or Windows Server Core.

I will start by discussing native add-ins but if you’re only interested in managed add-ins then feel free to skip ahead as managed add-ins are quite a lot simpler since the WindowClippings.dll managed assembly takes care of all of the plumbing.

Writing add-ins using native C++

Add-ins are packaged as COM servers. You can include as many add-ins as you wish in a server. Typically this involves creating a DLL project in Visual C++, exporting DllGetClassObject and friends, and implementing one COM class for each add-in. You can of course use whatever language, compiler and packaging model as long as you fulfill the responsibilities of a COM server.

The WindowClippings.h header file defines the IAddIn interface as well as the three interfaces that derive from it and represent the three types of add-ins supported by Window Clippings namely Filter, Save As and Send To add-ins. IAddIn is defined as follows:

struct DECLSPEC_UUID("...") DECLSPEC_NOVTABLE
IAddIn : IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_Location(__out BSTR* location) = 0;
    virtual HRESULT STDMETHODCALLTYPE get_Name(__out BSTR* name) = 0;
    virtual HRESULT STDMETHODCALLTYPE get_HasSettings(__out BOOL* hasSettings) = 0;
    virtual HRESULT STDMETHODCALLTYPE LoadSettings(IStream* source) = 0;
    virtual HRESULT STDMETHODCALLTYPE SaveSettings(IStream* destination) = 0;
    virtual HRESULT STDMETHODCALLTYPE EditSettings(HWND parent) = 0;
};

get_Location must be implemented and provides the fully-qualified path for the file that contains the add-in. This is used by Window Clippings to allow the user to easily unregister a given add-in. You could use the GetModuleFileName function to implement this method.

get_Name must be implemented and provides the display name for the add-in.

get_HasSettings must be implemented and indicates whether the add-in has configurable settings. If get_HasSettings return false through its hasSettings parameter then the next three methods will not be called and need not be implemented.

LoadSettings is called by Window Clippings prior to using the add-in and allows the add-in to load any configuration settings that were previously saved. This method should return E_NOTIMPL if get_HasSettings returns false.

SaveSettings is called by Window Clippings after the EditSettings method is called and the user chose to apply his or her changes. This method should return E_NOTIMPL if get_HasSettings returns false.

EditSettings is called by Window Clippings when the user chooses to edit the add-in’s settings. The method must display a modal dialog box with configuration settings. It should return E_NOTIMPL if get_HasSettings returns false.

The following class template may be used to simplify developing add-ins that are not configurable:

template <typename T>
class NoSettingsAddIn :
    public T
{
private:

    STDMETHODIMP get_HasSettings(__out BOOL* hasSettings)
    {
        HR_(E_POINTER, 0 != hasSettings);

        *hasSettings = false;
        return S_OK;
    }

    STDMETHODIMP LoadSettings(IStream* /*source*/)
    {
        return E_NOTIMPL;
    }

    STDMETHODIMP SaveSettings(IStream* /*destination*/)
    {
        return E_NOTIMPL;
    }

    STDMETHODIMP EditSettings(HWND /*parent*/)
    {
        return E_NOTIMPL;
    }

};

Add-ins must also be registered to implement the WindowClippingsCategory category (also defined in WindowClippings.h).

Filter add-ins implement the IFilter interface which is defined as follows:

struct DECLSPEC_UUID("...") DECLSPEC_NOVTABLE
IFilter : IAddIn
{
    virtual HRESULT STDMETHODCALLTYPE Process(Gdiplus::BitmapData* bitmapData) = 0;
};

So in addition to implementing IAddIn, you need to implement the Process method. The single BitmapData parameter is borrowed from GDI+ and provides the attributes of the image that Window Clippings has captured. The Process method may manipulate the bitmap directly before returning.

Save As add-ins implement the ISaveAs interface which is defined as follows:

struct DECLSPEC_UUID("...") DECLSPEC_NOVTABLE
ISaveAs : IAddIn
{
    virtual HRESULT STDMETHODCALLTYPE get_Extension(__out BSTR* extension) = 0;

    virtual HRESULT STDMETHODCALLTYPE Save(Gdiplus::BitmapData* bitmapData,
                                           COLORREF backColor,
                                           IStream* destination) = 0;
};

Save As add-ins are called by the built-in “Save to disk” add-in to save the image in the user’s chosen format.

get_Extension provides the file extension for the particular format that the add-in provides. This is called by Window Clippings when automatically generating a file name. It is also used to populate the filter combo box, along with the get_Name method, in the Save As dialog box if the user prefers to provide a file name directly.

The Save method is where you do the actual work of formatting the bitmap in your particular format and write the results to the stream. The BitmapData parameter provides a working copy of the image that Window Clippings has captured. A copy is provided so that you can freely manipulate it prior to formatting and saving the image. This can be useful depending on your image format’s capabilities. For example, the bitmap has an alpha channel but some formats don’t support that and you may need to “flatten” the image first. The COLORREF parameter indicates the user’s chosen background color. This should be used if you need to remove the alpha channel and replace it with the background color. Finally, the IStream is where you save the image.

Send To add-ins implement the ISendTo interface which is defined as follows:

struct DECLSPEC_UUID("...") DECLSPEC_NOVTABLE
ISendTo : IAddIn
{
    virtual HRESULT STDMETHODCALLTYPE Send(Gdiplus::BitmapData* bitmapData,
                                           BSTR title,
                                           COLORREF backColor,
                                           ISaveAs* saveAs) = 0;
};

The Send method is called by Window Clippings while executing the user’s action sequence. The BitmapData parameter provides a working copy of the image captured by Window Clippings. The image may have already been altered by any previous Filter add-ins. The BSTR parameter provides the title of the selected window, if any. This may be used if the destination of the Send To add-in can use or display it somehow. The COLORREF parameter indicates the user’s chosen background color. This should be used if the destination of the Send To add-in does not support an alpha channel. Finally, the ISaveAs parameter provides the Save As add-in that should be used in the event that the Send To add-in saves the image to a file. This might be useful if you’re writing an add-in to send to an FTP server for example.

The Window Clippings website will include developer information and complete working samples for each type of add-in when version 2.0 is released.

Writing add-ins using managed code

Welcome back Daniel.  :) 

Window Clippings 2.0 includes the WindowClippings.dll assembly that makes developing add-ins a breeze. Here’s what it looks like in .NET Reflector:

As you can see, it only has four public types. A bunch of internal types take care of all the hard work of making COM interop seamless, taking care of laying out the managed interfaces so that the vtables line up just right and the add-ins register themselves correctly. Not only that, but WindowClippings.dll is 100% MSIL without a hint of native code, making it platform agnostic. This means that any managed add-ins you develop will work with both 32-bit and 64-bit versions of Window Clippings (assuming your add-in assembly is not platform specific).

AddInRegistrar is for internal use only and should not be used. It is used by the (native) Window Clippings application to register managed add-ins.

Filter is an abstract class that you must derive from to implement a Filter add-in. Here’s an example of a filter add-in:

[Guid("...")]
public class FilterSample : Filter
{
    public FilterSample()
    {
        Name = "Filter sample";
    }

    protected override void Process(Bitmap bitmap)
    {
        bitmap.SetPixel(0, 0, Color.Red);
    }
}

Remember that every add-in class needs a unique GUID that you set using the Guid attribute. In this example the constructor sets the display name of the add-in and the abstract Process method is implemented with a simple modification of the bitmap. Now let’s make it configurable. First you need to set HasSettings to true in the constructor. You then need to override the protected virtual LoadSettings, SaveSettings and EditSettings methods. Here’s the updated example:

[Guid("...")]
public class FilterSample : Filter
{
    public FilterSample()
    {
        HasSettings = true;
        m_color = Color.Red; // default

        UpdateName();
    }

    protected override void Process(Bitmap bitmap)
    {
        bitmap.SetPixel(0, 0, m_color);
    }

    protected override void LoadSettings(BinaryReader reader)
    {
        m_color = Color.FromArgb(reader.ReadInt32());
        UpdateName();
    }

    protected override void SaveSettings(BinaryWriter writer)
    {
        writer.Write(m_color.ToArgb());
    }

    protected override void EditSettings(IWin32Window parentWindow)
    {
        using (ColorDialog dialog = new ColorDialog())
        {
            dialog.FullOpen = true;
            dialog.Color = m_color;

            if (DialogResult.OK == dialog.ShowDialog(parentWindow))
            {
                m_color = dialog.Color;
                UpdateName();
            }
        }
    }

    private void UpdateName()
    {
        Name = string.Format("Filter sample ({0})",
                             m_color);
    }

    private Color m_color;
}

And here’s what it looks like when you click the Settings button for this add-in:

If you look closely you’ll see a blue pixel in the top-left corner of the image thanks to this add-in.

Notice that I update the add-in’s Name property whenever the color is updated. Window Clippings will query the Name property after the user changes the add-in’s settings so this allows you to customize the name based on how the add-in is configured.

The Name and HasSettings properties as well as the LoadSettings, SaveSettings and EditSettings methods work identically for the other types of add-ins so I’m not going to discuss them again. Rest assured that Save As and Send To add-ins can provide configurable settings in just the same way.

SaveAs is an abstract class that you must derive from to implement a Save As add-in. Here’s an example of such an add-in:

[Guid("...")]
public class SaveAsGif : SaveAs
{
    public SaveAsGif()
    {
        Name = "GIF image";
        Extension = "gif";
    }

    public override void Save(Bitmap bitmap,
                              Color backColor,
                              Stream destination)
    {
        bitmap.Save(destination,
                    ImageFormat.Gif);
    }
}

You must set the Extension property to the file extension of the particular format your add-in provides. You must also override the Save method to take care of saving the bitmap to the destination stream. This example simply uses the Bitmap’s Save method to save the image using the GIF image format. Keep in mind that Bitmap will always be a 32-bit image including an alpha channel. Given an image format, such as GIF (GIF uses a color mask for transparency), which cannot handle the alpha channel, you need to remove any transparency from the image during or prior to formatting it. That’s where the Color parameter comes in. This is the background color chosen by the user and needs to be blended into the image to remove the alpha channel if your image format does not support it. Here’s a simple example:

public override void Save(Bitmap bitmap,
                          Color backColor,
                          Stream destination)
{
    FlattenBitmap(bitmap,
                  backColor);

    bitmap.Save(destination,
                ImageFormat.Gif);
}

private void FlattenBitmap(Bitmap bitmap,
                           Color backColor)
{
    for (int x = 0; x < bitmap.Width; ++x)
    {
        for (int y = 0; y < bitmap.Height; ++y)
        {
            Color color = bitmap.GetPixel(x, y);

            color = Color.FromArgb(color.R * color.A / 255 + backColor.R * (255 - color.A) / 255,
                                   color.G * color.A / 255 + backColor.G * (255 - color.A) / 255,
                                   color.B * color.A / 255 + backColor.B * (255 - color.A) / 255);

            bitmap.SetPixel(x, y, color);
        }
    }
}

SendTo is an abstract class that you must derive from to implement a Send To add-in. Here’s an example of such an add-in:

[Guid("...")]
public class SendToSample : SendTo
{
    public SendToSample()
    {
        Name = "Send to sample";
    }

    protected override void Send(Bitmap bitmap,
                                 string title,
                                 Color backColor,
                                 SaveAs saveAs)
    {
        // TODO: send image to destination
    }
}

You must override the Send method to take care of sending the image to its destination. This destination can be anything you can imagine such as a web service, database or application. The string parameter provides the original title of the window. The Color parameter provides the background color chosen by the user in the event that you need to flatten the image. The SaveAs parameter provides the add-in chosen by the user to handle image formatting in the event that your destination can handle any format.

That’s it for today. I hope this article provided you with a good idea of how to develop add-ins for Window Clippings.

Stay tuned for more highlights from the upcoming Window Clippings 2.0!

© 2007 Kenny Kerr

Posted by KennyKerr with 4 comment(s)
Filed under:

Looking Forward to Window Clippings 2.0: Add-Ins

I had planned to talk about add-in development next but realized that I really ought to explain what add-ins are and why you should care.

Window Clippings 2.0 supports 3 different types of add-ins: “Send To”, “Save As” and “Filter” add-ins. Briefly, Send To and Filter add-ins make up the available “actions” while Save As add-ins define the different image formats available to the user. There’s quite a lot to digest here so let’s start with the concept of actions.

Actions

Window Clippings 1.5 offered just three actions as illustrated in this image taken from its General tab:

These three actions have been around since the initial release of Window Clippings. The problem is that this set of actions is not extensible in any way. I’ve already spoken about post-save events and how they can be used to add some post-processing to your images but that is not enough in some cases and certainly not the most elegant solution for all scenarios.

Window Clippings 2.0 replaces the concept of “default actions” with an action sequence. An action sequence is an ordered list of actions that are executed one after another following the creation of an image. Here’s what the new General tab looks like in Window Clippings 2.0:

You can have as many actions in the sequence as you wish. To insert an action simply click the arrow button and a pop-up menu provides the list of actions that are available:

The action you pick is inserted after the currently selected action in the list. The pop-up menu lists Send To add-ins before the menu separator and Filter add-ins after the separator. You should get an idea of what constitutes these Send To and Filter add-ins by looking at the image above.

I mentioned that the actions are executed in sequence. This becomes important when adding filters to the action sequence. Unlike Save As add-ins, Filter add-ins modify the master image that is passed to each action so subsequent actions will benefit from any changes that were made. Consider the following sequence of actions:

In this example the resulting image is copied to the clipboard. It is then saved to disk based on the storage options. The in-memory, or master, image is then updated with a watermark and then uploaded to Flickr. So the image saved to disk does not include the watermark while the image posted to the web does. You can even add the same action (type) more than once. You might for example want to save both a full-color as well as a black and white version of an image to your hard drive. The following sequence of actions will do the trick:

The buttons to the right of the action sequence should be pretty self-explanatory but a helpful tool-tip is available if you need it. I’ve already described the arrow button. The second button allows you to edit the settings for the selected add-in, assuming the add-in is configurable. The delete button removes the selected action from the list. The up and down buttons adjusts the position of the selected action within the sequence.

Save As Add-Ins

I’ve already described the storage options, but briefly the Storage tab includes a combo box allowing you select the image format to use. The list of available formats is defined by “Save As” add-ins.

Add-In Management

The new Add-Ins tab allows you to manage the add-ins that are available to Window Clippings.

The list consists of all the add-ins registered on the computer. Add-ins are packaged as DLLs and a given library may contain multiple add-ins. By default the add-ins are grouped by their type. You can also click on the Location header to be able to see which add-ins are packaged together in the same library.

Although the add-ins provided by the WindowClippingsCore library cannot be unregistered, you can freely register and unregister other add-ins. Just keep in mind that unregistering an add-in has the effect of removing all add-ins provided by a particular library.

You can of course click the Settings button to change the settings for any configurable add-in. Here’s what the settings window looks like for the “Bitmap image” add-in:

Please note that the list of add-ins that will ship with Window Clippings 2.0 has not yet been finalized.

That’s it for today. Next time I’ll talk about how you can develop your own add-ins!

Version 1.5 is the current release and you can download it here.

© 2007 Kenny Kerr

Posted by KennyKerr with 3 comment(s)
Filed under:

WindowClippings.com

With the upcoming release of Window Clippings I've finally taken the plunge and set up a website that will be the permanent home of the Window Clippings product. It is just a simple page at this point and I will update the site before the 2.0 release with more content and features. Let me know what features you'd like to see, such as forums etc.

I will most likely still write about Window Clippings here on my blog but www.windowclippings.com is where I'll be pointing to when referring to the product. You can already go to www.windowclippings.com and download the current version so feel free to point to it when referring to Window Clippings.

Thanks again for all the support!

Stay tuned for more highlights from the upcoming Window Clippings 2.0! Up next is add-in development.

© 2007 Kenny Kerr

Posted by KennyKerr with 1 comment(s)
Filed under:

Looking Forward to Window Clippings 2.0: Cost

Update: Version 2.0 is now available! Download it now from http://www.windowclippings.com/.

 

Recently Jeff Atwood left this comment on my blog:

Kenny, 2.0 is looking flippin' sweet.

You have to set up some kind of PayPal donate button so we can contribute some bucks toward the development of this great utility you're giving us for free. I have $10 with your name on it.

I’m flattered that Jeff is excited about the upcoming release of Window Clippings and so willing to support my development of the product. I also think this is a good time to talk about money. I’ve been struggling to figure out how to bring this up and I believe full disclosure is the best option and as usual I welcome your feedback.

I have wanted to go out on my own as a software developer for quite some time and with the popularity of Window Clippings I have decided to make it my first commercial product under my own name. I love developing software but have realized that I really ought to be working for myself and developing products that I myself own instead of endlessly developing products for others. So I’m not looking to get rich off the success of Window Clippings but am simply hoping to start something that will one day put food on the table for my family. I’m a firm believer in doing what you love but up till now Window Clippings and the many other free tools and technical articles I offer on this blog have not made a dime. Turning Window Clippings as well as a few other neat product ideas I have into a business of my own is something that I am very excited about.

As such, Window Clippings 2.0 will offer the option of registration. Window Clippings 2.0 will remain free to use but newer features introduced in Window Clippings 2.0 will only be available to registered users. So if you choose not to register you will still be able to continue using Window Clippings without losing any of the functionality you know and love from the 1.5 release. Unregistered users will benefit from many of the improvements that I have made to the existing features as well as bug fixes, performance improvements, increased installation and configuration flexibility, and so on.

I also don’t want to burden users with complex licensing schemes and restrictive activation roadblocks so I am making it quite simple. You can purchase a license of Window Clippings that is associated with your email address (used only as a licensing identifier) and for that you receive a license key that you can use to unlock the new features in Window Clippings 2.0. You can register Window Clippings on as many computers as you wish provided they are primarily for your own use or that of your family. I am also not going to spend much energy making it hacker-proof at this point. I know enough about Windows security to put some major roadblocks in the way of those hackers but I’d rather not penalize my honest and faithful users with unnecessary restrictions and complexity.

What will it cost already?!

Well Jeff hit it on the head! I am pricing Window Clippings 2.0 at $10 for a single user license. I believe Window Clippings provides great value and is a huge time-saver and as such is worth more but I would like to encourage as many people as possible to use the full product so I don’t want to turn people away with a seemingly high cost.

I know a lot of you are wondering when you will be able to get your hands on it. I’m hoping to release Window Clippings 2.0 around the end of May, but as its not currently making any money I have to obviously keep up my day job so the schedule may be pushed back a little.

An alternative strategy is for me to find a sponsor for Window Clippings, perhaps a large software vendor would like to offer Window Clippings as part of Windows  :)  (sorry but the Snipping Tool doesn’t cut it).

Stay tuned for more highlights from the upcoming Window Clippings 2.0!

Version 1.5 is the current release and you can download it here.


© 2007 Kenny Kerr

Posted by KennyKerr with 5 comment(s)
Filed under:

Looking Forward to Window Clippings 2.0: Storage

Update: Version 2.0 is now available! Download it now from http://www.windowclippings.com/.

 

Scott Hanselman today mentioned that it would be nice if Window Clippings could automatically call PNGOUT to compact images created using Window Clippings so that an additional step would not be required. Well Scott, your wish is my command.  :)  Seriously, this happens to be something supported by Window Clippings 2.0 so I thought this would be a good time to talk about it.

Continuing my look at some of the highlights in the upcoming Window Clippings 2.0 release, today I want to share what I’ve done to improve the storage features. (So far I’ve introduced features related to capturing pop-ups and advanced selection features.)

Window Clippings 1.5 provides two storage settings. You can specify where images will be stored automatically or be prompted for a location. You can also choose between Bitmap, JPEG, PNG and TIFF image formats. You do not however have any control over the image format characteristics like JPEG compression or bitmap color depth.

Window Clippings 2.0 introduces a few major improvements to the storage options. Here’s what the new Storage tab looks like:

Copy image file to clipboard

This checkbox enables just what it says. After the image is created, the file is copied to the clipboard as if you copied it in Windows Explorer. You can then paste it into another folder in Explorer and a copy of the file will appear. You can paste it into an OLE-compatible application like Microsoft Word and the image will be pasted into the document. It also stores an additional clipboard format automatically allowing you to paste into a text box or editor and the full path to the file will be inserted.

This may seem like a small touch but it can save a lot of time as it cuts down the number of steps involved in getting your screenshots to where they need to go, whether it’s pasting it into a document or pasting the path into an FTP utility for upload.

Format

Window Clippings 2.0 still supports the four formats offered by version 1.5 but now the sky’s the limit. With the introduction of Window Clippings Add-ins, which I’ll introduce in an upcoming blog post, anyone can write an add-in to “save as” any format they can think of. Window Clippings 2.0 will ship with add-ins to support the Bitmap, JPEG, PNG and TIFF image formats. Add-ins can also provide settings that may be configured by the user.

As an example, here is the settings window for the JPEG image format:

And here is the settings window for the TIFF image format:

As I mentioned, you can write your own add-ins to support different formats so if you want a format I don’t provide, for example Photoshop’s PSD format, or even if you think you can do a better job creating PNG files for example then by all means write your own add-in.

Post-Save Event

The post-save event is also pretty self-explanatory. You simply provide a command that you would like to execute after the image is saved to disk and Window Clippings will launch it for you. In this example I use it to run pngout.exe after every image is created so that I don’t have to do it manually before uploading my images.

Stay tuned for more highlights from the upcoming Window Clippings 2.0!

Version 1.5 is the current release and you can download it here.


© 2007 Kenny Kerr

Posted by KennyKerr with 6 comment(s)
Filed under:

Looking Forward to Window Clippings 2.0: Selection

Continuing my look at some of the highlights in the upcoming Window Clippings 2.0 release, today I want to share what I’ve done to improve the selection features. In Window Clippings 1.5 you can only select top-level, non-maximized windows. Window Clippings 2.0 supports selection of virtually anything you can see on screen. You can select maximized windows (one of the most frequently requested features), MDI child windows, disabled windows, individual controls, etc. You can also create images without ever selecting a window.

Take a look at the new context menu provided by Window Clippings 2.0:

The first thing you should notice is the new selection modes.

Select Windows is the mode used by Window Clippings 1.5 where you can simply click on a window to select it. In version 2.0 this mode gets more powerful. Here is an example illustrating how a number of window (controls) were selected using the Ctrl key. You can add and remove windows from a selection in the same way that you might add and remove files in a selection in Windows Explorer by holding down the Ctrl key and selecting or deselecting a window.

 

The resulting image is what you might expect with transparency making up the space around the buttons:

You can of course use the Ctrl key to include arbitrary windows from different applications together:

Crop or Expand Selection is a powerful new selection mode allowing you to either select an arbitrary rectangular region on the screen or to crop a selection of windows. Assuming no windows are selected, you can simply select a region to capture by dragging the mouse and adjusting the selection as necessary:

The resulting image is what you might expect:

It gets really interesting however when you start combining the different selection modes. You can start by selecting a window or two and then changing the selection mode to “Crop or Expand Selection”. If a crop rectangle has not yet been created, one will be created matching the bounds of the selected windows and optionally include space for the window shadows, assuming you opted to include shadows when configuring Window Clippings’ options. You can then adjust the rectangle to crop some part of the resulting image.

Here is the resulting image:

This is a handy way of creating a screenshot of just a portion of a window, saving you from having to open the resulting image in an image editor just to crop it.

There are even more features related to selection, including being able to automatically select common areas such as the entire desktop, a particular monitor, and so on.

Stay tuned for more highlights from the upcoming Window Clippings 2.0!


Version 1.5 is the current release and you can download it here.


© 2007 Kenny Kerr

Posted by KennyKerr with 5 comment(s)
Filed under:

I’m an MVP! ... Again!

I just received word that I have received the Microsoft MVP Award ... again! I received the MVP award in 2005 for Developer Security. This time around the award acknowledges my contributions to the Visual C++ community.

Thanks to Sasha as well as the numerous people that nominated and supported me over the years!


© 2007 Kenny Kerr

Posted by KennyKerr with no comments
More Posts