Introduction
Say we have a process that takes a lot of time to complete - wouldn't it be helpful to add a NotifyIcon
control (hidden from our main form, so we do not bother the user until we are done)
to show the progress in the system tray Icon area? Here is
a simple code to achieve this, by drawing some text in the application system tray
Icon dynamically.
Using the code
- Click File -> New -> Project. Create a ChangeIcon Visual C# Windows Application
Project
- Click View -> Toolbox.
- From the Toolbox, drag a ContextMenu item into the Form1 form.
- Click in the Context Menu menu item, appearing at top of the form, change
Type Here, with
&Show
. Press Enter. - Double-click the newly created Show menu item.
- Change the menuItem1_Click method with:
Double-click the startButton button. Replace the startButton_Click
method with:
private void menuItem1_Click(object sender, System.EventArgs e)
{
this.Show();
}
- From the Toolbox, drag a NotifyIcon into the Form1 form.
- Right Click the
NotifyIcon1
NotifyIcon -> Properties. Set the property name to trayIcon
. Click in the Icon property, push the button
which appears next to it, and browse for the App.ico within the Wizard created ChangeIcon
folder. Finally, set the ContextMenu property to contextMenu1
. - From the Toolbox, drag a ProgressBar into the Form1 form. Set the Dock property
to Top.
- From the Toolbox, drag a Button into the Form1 form. Change the text property
to Start, and the name to startButton.
- From the Toolbox, drag another Button into the Form1 form. Change the text
property to Hide, and name to hideButton.
- From the Toolbox, drag a Timer to the form.
Double-click the startButton button. Replace the startButton_Click
method with:
private void startButton_Click(object sender, System.EventArgs e)
{
timer1.Enabled = true;
startButton.Enabled = false;
progressBar1.Value = progressBar1.Minimum;
progressBar1.Step = 1;
}
Double-click the hideButton button. Replace the hideButton_Click
method with:
private void hideButton_Click(object sender, System.EventArgs e)
{
this.Hide();
}
Double-click the Timer1 timer. Replace the timer1_Tick
method with:
private void timer1_Tick(object sender, System.EventArgs e)
{
if (progressBar1.Value == progressBar1.Maximum)
{
timer1.Enabled = false;
startButton.Enabled = true;
}
else
{
progressBar1.PerformStep();
string text = "Ok";
if (progressBar1.Value != progressBar1.Maximum)
text = progressBar1.Value.ToString();
System.Resources.ResourceManager resources = new
System.Resources.ResourceManager(typeof(Form1));
Bitmap bmp =( (System.Drawing.Icon)(resources.GetObject
("trayIcon.Icon"))).ToBitmap();
System.Drawing.Graphics ImageGraphics =
System.Drawing.Graphics.FromImage(bmp);
System.Drawing.Font drawFont = new System.Drawing.Font
("Arial Narrow", 20, FontStyle.Regular);
System.Drawing.SolidBrush drawBrush = new System.Drawing.SolidBrush
(System.Drawing.Color.Blue);
System.Drawing.StringFormat drawFormat =
new System.Drawing.StringFormat();
ImageGraphics.DrawString(text,drawFont, drawBrush, -2, 1, drawFormat);
drawFont.Dispose();
drawBrush.Dispose();
ImageGraphics.Dispose();
trayIcon.Icon = Icon.FromHandle(bmp.GetHicon());
trayIcon.Text = text;
}
}
Finally, press (F5). That's it!
Rodolfo Ortega is a Cuban Computer Scientist. He works as IT Auditor for the CIMEX S.A. subsidiary in Holguin, Cuba. He lives and works in Holguin, in the eastern part of the island of Cuba.
You can contact him at rodolfom[]cimex.com.cu for any personal message: Ideas on new articles, bibliography about new APIs, questions, are wellcome.
Submit questions related with current article to the article forum.