Shell_NotifyIcon托盤圖標閃爍

以前的同事留下了一個程序會莫名閃退的bug,今天終於發現是托盤圖標閃爍使得gdi資源耗盡致使的。shell


先定義api

#include "shellapi.h" //托盤圖標引用

NOTIFYICONDATA        m_NotifyIconData;

m_NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);//長度
m_NotifyIconData.hWnd = m_hWnd;//窗口句柄
m_NotifyIconData.hIcon = GETRESPROVIDER->LoadIcon(_T("CROWD_ICON"),16);;//加載圖標進去
m_NotifyIconData.uCallbackMessage = WM_NOTIFYICON;//這個是點擊圖標的事件消息,咱們在消息處理函數WndProc()裏面寫一個case WM_NOTIFYICON:去處理鼠標點擊圖標事件
m_NotifyIconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;//圖標樣式

_tcscpy(m_NotifyIconData.szTip, _T("程序名"));//當鼠標移動到圖標的時候顯示

Shell_NotifyIcon(NIM_ADD, &m_NotifyIconData);

//設置閃爍的定時器
SetTimer(TIMMER_SPANGLED_ICON,200);

在定時器裏面實現閃爍函數

case TIMMER_SPANGLED_ICON:
    {
        if( m_NotifyIconData.hIcon)
        {
            DestroyIcon(m_NotifyIconData.hIcon) ;
            m_NotifyIconData.hIcon = NULL;
            Shell_NotifyIcon(NIM_MODIFY, &m_NotifyIconData);
        }
        else
        {
            DestroyIcon(m_NotifyIconData.hIcon) ;
            m_NotifyIconData.hIcon = GETRESPROVIDER->LoadIcon(_T("CROWD_ICON"),16);;//加載圖標進去
            Shell_NotifyIcon(NIM_MODIFY, &m_NotifyIconData);
        }
    }
    break;

這裏要注意DestroyIcon(m_NotifyIconData.hIcon) ;這一句,若是不用這一句,每次閃爍都會 使得GDI資源的增長,最終耗盡GDI資源致使崩潰。GDI資源狀況可在任務管理器—>詳細信息  中看到。spa

image

最後刪除code

DestroyIcon(m_NotifyIconData.hIcon) ;
Shell_NotifyIcon(NIM_DELETE,&m_NotifyIconData);
相關文章
相關標籤/搜索