{
// 將圖標放入系統托盤
nd.cbSize = sizeof (NOTIFYICONDATA);
nd.hWnd = m_hWnd;
nd.uID = IDR_MAINFRAME;
nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nd.uCallbackMessage= MYWM_NOTIFYICON;
nd.hIcon = m_hIcon;
strcpy(nd.szTip, "系統托盤->詳解"); //這個是托盤的註釋
Shell_NotifyIcon(NIM_ADD, &nd); //增加托盤
在OnInitDialog()裏面,return TRUE之前,添加:
AddIcon();
(1)在CMyDlg類的頭文件中定義:
//用戶定義的消息
#define MYWM_NOTIFYICON WM_USER+1
(2)
我們重載WindowProc()函數, 此外,我們還希望在主框架窗口最小化時圖標不在任務欄的空白區出現,在此函數中同時作相應處理。(重載WindowProc函數: 右鍵CMyDlg類->Add Virtual Function->選擇WindowProc->Add and Edit)
{
// TODO: Add your specialized code here and/or call the base class
switch(message)
{
case MYWM_NOTIFYICON:
//如果是用戶定義的消息
if(lParam==WM_LBUTTONDBLCLK)
{
//鼠標雙擊時主窗口出現
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);
}
else if(lParam==WM_RBUTTONDOWN){
CMenu menu;
menu.LoadMenu(IDR_RIGHT_MENU); //載入事先定義的選單 這個菜單是你提前建好的下拉菜單名字就是IDR_RIGHT_MENU
CMenu*pMenu=menu.GetSubMenu(0);
CPoint pos;
GetCursorPos(&pos);
pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());
}
break;
//如果是系統消息
if(wParam==SC_MINIMIZE)
{
//接收到最小化消息時主窗口隱藏
AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);
return 0;
}
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}
3.// 將圖標從系統托盤中刪除
做了這個代碼後 如果關掉程序 托盤會立即消失 不會延時
爲使應用程序退出時圖標消失,映射WM_DESTROY消息! (映射WM_DESTROY->右鍵CMyDlg類->Add Windows Message Handler->左邊選擇WM_DESTROY->Add and Edit)
void CMyDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
// 將圖標從系統托盤中刪除
//NOTIFYICONDATA nd;
nd.cbSize = sizeof (NOTIFYICONDATA);
nd.hWnd = m_hWnd;
nd.uID = IDR_MAINFRAME;
nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nd.uCallbackMessage = MYWM_NOTIFYICON;
nd.hIcon = m_hIcon;
Shell_NotifyIcon(NIM_DELETE, &nd);
}
在右鍵菜單中選擇一項後,就會發送命令消息WM_COMMAND,在ClassWizard裏添加WM_COMMAND的消息處理函數: