1、在資源中的Icon中匯入一個自己喜歡的表徵圖,ID命名為IDR_MAINFRAME,將先前的IDR_MAINFRAME的表徵圖刪除掉;
2、在自己的Dialog標頭檔中定義一個變數 NOTIFYICONDATA m_nid,關於該結構體的具體資訊可以查閱MSDN;
3、添加訊息響應函數OnInitDialog(),並在該函數中添加以下代碼,這樣程式一啟動,就在托盤中顯示出了自己應用程式的表徵圖。
//---------------------------托盤顯示---------------------------------//
m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
m_nid.hWnd = this->m_hWnd;
m_nid.uID = IDR_MAINFRAME;
m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
m_nid.uCallbackMessage = WM_SHOWTASK; // 自訂的訊息名稱
m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(m_nid.szTip, "伺服器程式"); // 資訊提示條為"伺服器程式",VS2008 UNICODE編碼用wcscpy_s()函數
Shell_NotifyIcon(NIM_ADD, &m_nid); // 在托盤區添加表徵圖
這時候編譯,會報WM_SHOWTASK的錯,因為該訊息要自己定義。
4、在Dialog標頭檔中聲明訊息函數原型
LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
5、在Dialog源檔案中進行訊息映射
ON_MESSAGE(WM_SHOWTASK,OnShowTask)
6、在Dialog源檔案中添加自訂的訊息響應代碼,左鍵雙擊彈出應用程式主視窗,按右鍵快顯功能表。
LRESULT CServerDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
{
if(wParam != IDR_MAINFRAME)
return 1;
switch(lParam)
{
case WM_RBUTTONUP: // 右鍵起來時快顯功能表
{
LPPOINT lpoint = new tagPOINT;
::GetCursorPos(lpoint); // 得到滑鼠位置
CMenu menu;
menu.CreatePopupMenu(); // 聲明一個彈出式菜單
menu.AppendMenu(MF_STRING, WM_DESTROY, "關閉");
menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this);
HMENU hmenu = menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK: // 雙擊左鍵的處理
{
this->ShowWindow(SW_SHOWNORMAL); // 顯示主視窗
}
break;
}
return 0;
}
7、添加OnSize訊息響應函數,處理最小化時的操作。
void CServerDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if(nType == SIZE_MINIMIZED)
{
ShowWindow(SW_HIDE); // 當最小化市,隱藏主視窗
}
}
8、添加關閉視窗時的訊息響應函數,將托盤中的應用程式圖示刪除
BOOL CServerDlg::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
// 在托盤區刪除表徵圖
Shell_NotifyIcon(NIM_DELETE, &m_nid);
return CDialog::DestroyWindow();
}
經過以上的步驟,就編寫出了一個簡單的可以最小化到托盤的程式。該程式在一啟動時,在托盤創立應用程式的表徵圖,最小化程式時隱藏主視窗,雙擊托盤區的表徵圖時,顯示主視窗,右鍵點擊托盤區視窗時,快顯功能表進行相應的操作。