以前的同事留下了一個程序會莫名閃退的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
最後刪除code
DestroyIcon(m_NotifyIconData.hIcon) ;
Shell_NotifyIcon(NIM_DELETE,&m_NotifyIconData);