一、未考虑GDI泄漏的代码:后果是直接导致程序的GDI数一直增加,直到程序crash(崩溃)为止
int i = 0;
private void timer1_Tick(object sender, EventArgs e)
{
Bitmap btm1 = new Bitmap(this.imageList1.Images[0]);
Icon icon1 = Icon.FromHandle(btm1.GetHicon());
Bitmap btm2 = new Bitmap(this.imageList1.Images[1]);
Icon icon2 = Icon.FromHandle(btm2.GetHicon());
if (i < 1)
{
this.notifyIcon1.Icon = icon1;
i = 1;
}
else
{
this.notifyIcon1.Icon = icon2;
i = 0;
}
}
二、修改之后的代码:
int i = 0;
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static bool DestroyIcon(IntPtr handle);
private void timer1_Tick(object sender, EventArgs e)
{
Bitmap btm1 = new Bitmap(this.imageList1.Images[0]);
Icon icon1 = Icon.FromHandle(btm1.GetHicon());
Bitmap btm2 = new Bitmap(this.imageList1.Images[1]);
Icon icon2 = Icon.FromHandle(btm2.GetHicon());
if (i < 1)
{
this.notifyIcon1.Icon = icon1;
i = 1;
}
else
{
this.notifyIcon1.Icon = icon2;
i = 0;
}
DestroyIcon(icon2.Handle);
DestroyIcon(icon1.Handle);
}