【原创】使用timer、imagelist与notifyicon控件实现图标闪烁并避免了GDI泄漏(重点)

      一、未考虑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);

}

原文地址:https://www.cnblogs.com/rainuu/p/2169394.html