1. 程式人生 > >windows程式托盤圖示以及訊息提示--基本知識(Shell_NotifyIcon)

windows程式托盤圖示以及訊息提示--基本知識(Shell_NotifyIcon)

之前說了NOTIFYICONDATA結構體的一些內容,下面繼續。

Shell_NotifyIcon函式,向工作列的狀態列傳送一個訊息。

原型如下:

BOOL Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA lpdata)

引數簡要說明:
dwMessage為輸入引數,傳遞傳送的訊息,表明要執行的操作。
可選的值如下:
NIM_ADD
向托盤區域新增一個圖示。此時第二個引數lpdata指向的NOTIFYICONDATA結構體中的hWnd和uID成員用來標示這個圖示,以便以後再次使用Shell_NotifyIcon對此圖示操作。
NIM_DELETE
刪除托盤區域的一個圖示。此時第二個引數lpdata指向的NOTIFYICONDATA結構體中的hWnd和uID成員用來標示需要被刪除的這個圖示。
NIM_MODIFY
修改托盤區域的一個圖示。此時第二個引數lpdata指向的NOTIFYICONDATA結構體中的hWnd和uID成員用來標示需要被修改的這個圖示。
NIM_SETFOCUS
Version 5.0. 設定焦點。比如當用戶操作托盤圖示彈出選單,而有按下ESC鍵將選單消除後,程式應該使用此訊息來將焦點設定到托盤圖示上。
NIM_SETVERSION
Version 5.0. 設定工作列按照第二個引數lpdata指向的NOTIFYICONDATA結構體中的uVersion成員指定的版本號來工作。此訊息可以允許使用者設定是否使用基於Windows2000的version 5.0的風格。uVersion的預設值為0,預設指明瞭使用原始Windows 95圖示訊息風格。具體這兩者的區別請參考msdn中的Shell_NotifyIcon函式說明的Remarks。

lpdata為輸入引數,是指向NOTIFYICONDATA結構體的指標,結構體內容用來配合第一個引數wMessage進行圖示操作。

如果圖示操作成功返回TRUE,否則返回FALSE。
如果dwMessage引數設為NIM_SETVERSION,則如果版本設定成功返回TRUE,如果設定的版本不支援返回FALSE。

該函式主要用於工作列右側的托盤圖示的操作。

下面簡單的幾行程式碼詳細說明:
實現最小化到托盤的具體操作如下,基於mfc dialog吧:

1.在Resource裡新建一個圖示 Icon 。
2.在窗體類裡新增 NOTIFYICONDATA 結構體物件 m_nfData,可以在OnInitDialog()方法裡對結構體進行初始化。
3.重寫OnSize(UINT,int,int)函式,自行處理SIZE_MINIMIZED 訊息,即點選最小化後的處理。例如:

void CYourProjectDlg::OnSize(UINT nType, int cx, int cy)
{
if( nType == SIZE_MINIMIZED ) //截獲訊息
{
    Shell_NotifyIcon(NIM_ADD,&m_nfData);
    ShowWindow(SW_HIDE);
}
else //其他訊息按預設處理方式處理
    CDialog::OnSize(nType, cx, cy);
}

4.新增訊息對映,處理WM_TRAYICON訊息,即點選托盤圖示後的處理

ON_MESSAGE(WM_TRAYICON,&CYourProjectDlg
::OnTrayIcon)

5.實現訊息對映函式,新增具體操作,例如:

LRESULT CLogCleanToolDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam)
{
if(lParam == WM_LBUTTONDBLCLK) //雙擊托盤圖示
{
    Shell_NotifyIcon(NIM_DELETE,&m_nfData);
    ShowWindow(SW_SHOWNORMAL);
    SetForegroundWindow();
}
return 0;
}