天天看點

MFC中使用工作列顯示圖示表示程式最小化1 在工作列中顯示圖示2 最小化按鍵消息處理3 工作列圖示滑鼠動作的響應

在工作列中通過圖示表示應用程式,就是當按下應用程式視窗的最小化按鍵時,隐藏視窗,并在工作列中顯示圖示表示該應用程式;當滑鼠點選了工作列中的圖示時,顯示視窗,并删除工作列中的圖示。

1 在工作列中顯示圖示

通過NOTIFYICONDATA結構和Shell_NotifyIcon()函數實作圖示的顯示。

1.1 NOTIFYICONDATA結構

該結構包含了系統所需的程序工作列狀态區域消息。該結構的成員變量較多,一般需要設定的變量有cbSize、hWnd、uID、uFlags、hIcon、uCallbackMessage、szTip等。其中,

cbSize表示NOTIFYICONDATA結構的大小;

hWnd指定了接收通知消息的視窗句柄,該通知消息與工作列中的圖示相關;

uID指定了該操作工作列中的哪個圖示;

uFlags表示NOTIFYICONDATA結構中哪些成員變量需要設定;

hIcon指定了要在工作列中添加、删除或者修改的圖示句柄;

uCallbackMessage:指定了一個自定義的消息,當在工作列顯示的圖示區域内發生滑鼠動作時,該消息将會被發送給hWnd指定的視窗。通過該消息的響應函數,即可實作對滑鼠動作的處理。

szTip表示滑鼠在工作列圖示上時顯示的提示資訊。

NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = this->m_hWnd;
nid.uID = IDI_ICON1;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nid.uCallbackMessage = WM_SHOWTASK;
nid.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
strncpy(nid.szTip, ("鍵盤屏蔽"), sizeof("鍵盤屏蔽"));
nid.szTip[sizeof("鍵盤屏蔽")] = _T('\0');
           

其中,IDI_ICON1 是項目中圖示資源的 ID ; uFlags 的值中, NIF_ICON 、 NIF_MESSAGE 和 NIF_TIP 分别表示結構的 hIcon 、 uCallbackMessage 和 szTip 三個成員變量将被使用; WM_SHOWTASK 是自定義消息,當在工作列的 IDI_ICON1 圖示範圍内發生滑鼠動作,則該消息将會被發送給程式主視窗。

1.2 Shell_NotifyIcon()函數

使用Shell_NotifyIcon()函數在工作列中顯示圖示。該函數的作用是将消息發送給工作列的狀态區域,系統收到消息後,進行後續處理。Shell_NotifyIcon()函數的格式為

BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA lpdata
);
           

其中,參數dwMessage 表示向工作列狀态區域發送的消息,該消息可以是添加圖示、删除圖示和修改圖示等消息,系統收到不同的消息進行不同的處理; lpdata 是 NOTIFYICONDATA 結構的指針,包含了工作列圖示的相關資訊。如果發送消息成功,則傳回值為 TRUE ,否則為 FALSE 。

Shell_NotifyIcon(NIM_ADD, &nid);
           

其中,NIM_ADD 表示向工作列中添加圖示,添加圖示的相關資訊儲存在 nid 中。

2 最小化按鍵消息處理

當按下視窗最小化按鍵後,應該隐藏目前視窗,并且在工作列中顯示程式對應的圖示。按下視窗最小化按鍵,會向系統發送WM_SYSCOMMAND消息。通過ON_WM_SYSCOMMAND宏指定該消息的響應函數,該消息的響應函數為OnSysCommand()。以上消息映射宏及消息響應函數在程式建立時已經自動建立完畢。

OnSysCommand()函數的格式為

afx_msg void OnSysCommand(
   UINT nID,
   LPARAM lParam
);
           

其中,參數nID 表示收到的系統指令的類型; lParam 表示滑鼠在系統指令菜單上的坐标。在該函數中,對 nID 的類型進行判斷,如果按下的是最小化按鍵,則隐藏視窗,并且在工作列中顯示程式對應的圖示。

if (nID == SC_MINIMIZE)
{
ShowWindow(SW_HIDE);
HideToTray();
}
           

其中,SC_MINIMIZE 表示按下了最小化按鍵, ShowWindow() 函數的作用是隐藏目前視窗, HideToTray() 函數的功能是在工作列中顯示圖示。

3 工作列圖示滑鼠動作的響應

在前面已經提到,當滑鼠點選工作列圖示後,顯示程式主視窗并且在工作列中删除圖示。對于滑鼠點選的響應,NOTIFYICONDATA結構的uCallbackMessage成員變量指定了發生滑鼠動作時發送的消息。接下來對該消息進行響應。

3.1 聲明消息響應函數

在頭檔案中對消息響應函數進行聲明。

LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
           

3.2 消息響應宏

在執行檔案中使用ON_MESSAGE宏将消息與相應函數關聯。

ON_MESSAGE(WM_SHOWTASK, OnShowTask)
           

3.3 定義消息響應函數

消息響應函數的兩個參數wParam和lParam分别表示滑鼠動作所在工作列圖示的ID和滑鼠動作對應的消息。

if (wParam != IDI_ICON1)
{
return -1;
}
switch (lParam)
{
case WM_LBUTTONUP:
ShowWindow(SW_SHOW);
HideFromTray();
break;
default:
break;
}
           

其中,IDI_ICON1 是在 NOTIFYICONDATA 結構的 uID 成員變量的值。當滑鼠點選了狀态欄中圖示時,顯示程式主視窗。 HideFromTray() 函數為自定義函數,該函數的作用是從工作列中删除程式對應的圖示,該函數的定義為

NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = this->m_hWnd;
nid.uID = IDI_ICON1;
nid.uFlags = 0;
Shell_NotifyIcon(NIM_DELETE, &nid);
           

其中,Shell_NotifyIcon() 函數的第一個參數為 NIM_DELETE ,表示從工作列中删除程式對應的圖示。