Dear visitor, thanks for stopping by! If you want, you can follow all updates on Snowball.be via RSS. You can also follow me on Twitter or Facebook. More interesting posts from other Microsoft Regional Directors can be found at The Region.
Gill Cleeren     .net | C# | Programming     June 18, 2006    

For some time, I have been wondering how to create flashing, animated notify icons that appear in your taskbar. Windows has a lot of these, like for example MSN Messenger uses one when a person signs in. Or the flashing network icon when there is traffic going in or out.

I started thinking at first it used some kind of animated gif, but soon realized that that isn’t possible, since the NotifyIcon control in WinForms programs can only handle *.ico files or *.bmp files.

Now I found out how this actually works: the key element is the Timer control. It fires events at a regular interval, and what actually happens is that the icon is changed at these regular intervals.

To show “the magic”, I created a little demo-project.

First, create an array of icons:
private Icon[] icons = new Icon[4];

Then, load in the images. It’s actually creating an animated gif, only that now, you have to programmatically change between the steps.

icons[0] = new Icon("green.ico");
icons[1] = new Icon("red.ico");
icons[2] = new Icon("green.ico");
icons[3] = new Icon("red.ico");

Add a NotifyIcon and a Timer control to your program. Set the timer to an interval of 1000 (that is milliseconds).

Now, create the Tick event of the timer, to fire the event that will change the icon displayed in the NotifyIcon.
Since we have loaded the icons in an array, all we have to do is change the index in the array, and update the icon in the NotifyIcon accordingly.

private void timerChangeIcons_Tick(object sender, EventArgs e)
{
   animatedIcon.Icon = icons[currentIcon];
   currentIcon++;
      if (currentIcon == 4)
         currentIcon = 0;
}

Don’t forget to add the timer.Start() to the load of your form!

I did however notice something strange in the behavior of C#. It appears that icons created with for example PhotoShop or Paint throw an error when loaded: "Argument 'picture' must be a picture that can be used as a Icon”. This appears that have been a problem already in C# 1.0 and it is not addressed under C# 2.0.
To correctly display the created icons, you have to change the headers, based on Windows API documentation.
A workaround I found, is simply to open the icons in Visual Studio and save them again. This worked correctly afterwards.

The complete code can be found in the zip-file.

FlashingNotifyIcon.zip (14.98 KB)

kick it on dotnetkicks.com
  Posted on: Sunday, June 18, 2006 12:13:28 PM (Romance Daylight Time, UTC+02:00)   |   Comments [0] Tracked by:
"Winforms how-to: Dynamically changing the icon shown in the taskbar " (dotnetki... [Trackback]

         
Comments are closed.
9/2/2010   9:32:04 PM