一、在資源中的Icon中導入一個本身喜歡的圖標,ID命名爲IDR_MAINFRAME,將先前的IDR_MAINFRAME的圖標刪除掉;服務器
二、在本身的Dialog頭文件中定義一個變量 NOTIFYICONDATA m_nid,關於該結構體的具體信息能夠查閱MSDN;函數
三、添加消息響應函數OnInitDialog(),並在該函數中添加如下代碼,這樣程序一啓動,就在托盤中顯示出了本身應用程序的圖標。this
1 //---------------------------托盤顯示---------------------------------// 2 3 m_nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); 4 5 m_nid.hWnd = this->m_hWnd; 6 7 m_nid.uID = IDR_MAINFRAME; 8 9 m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ; 10 11 m_nid.uCallbackMessage = WM_SHOWTASK; // 自定義的消息名稱 12 13 m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); 14 15 strcpy(m_nid.szTip, "服務器程序"); // 信息提示條爲"服務器程序",VS2008 UNICODE編碼用wcscpy_s()函數 16 17 Shell_NotifyIcon(NIM_ADD, &m_nid);// 在托盤區添加圖標
這時候編譯,會報WM_SHOWTASK的錯,由於該消息要本身定義。編碼
四、在Dialog頭文件中聲明消息函數原型 spa
LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);
五、在Dialog源文件中進行消息映射code
ON_MESSAGE(WM_SHOWTASK,OnShowTask)
六、在Dialog源文件中添加自定義的消息響應代碼,左鍵雙擊彈出應用程序主窗口,右鍵單擊彈出菜單。blog
1 LRESULT CServerDlg::OnShowTask(WPARAM wParam, LPARAM lParam) 2 { 3 if(wParam != IDR_MAINFRAME) 4 return 1; 5 switch(lParam) 6 { 7 case WM_RBUTTONUP: // 右鍵起來時彈出菜單 8 { 9 LPPOINT lpoint = new tagPOINT; 10 ::GetCursorPos(lpoint);// 獲得鼠標位置 11 CMenu menu; 12 menu.CreatePopupMenu();// 聲明一個彈出式菜單 13 menu.AppendMenu(MF_STRING, WM_DESTROY, "關閉"); 14 menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x ,lpoint->y, this); 15 HMENU hmenu = menu.Detach(); 16 menu.DestroyMenu(); 17 delete lpoint; 18 } 19 break; 20 case WM_LBUTTONDBLCLK: // 雙擊左鍵的處理 21 { 22 this->ShowWindow(SW_SHOWNORMAL);// 顯示主窗口 23 } 24 25 break; 26 } 27 return 0; 28 }
七、添加OnSize消息響應函數,處理最小化時的操做。ip
1 void CServerDlg::OnSize(UINT nType, int cx, int cy) 2 { 3 CDialog::OnSize(nType, cx, cy); 4 if(nType == SIZE_MINIMIZED) 5 { 6 ShowWindow(SW_HIDE); // 當最小化市,隱藏主窗口 7 } 8 }
八、添加關閉窗口時的消息響應函數,將托盤中的應用程序圖標刪除資源
1 BOOL CServerDlg::DestroyWindow() 2 { 3 // 在托盤區刪除圖標 4 Shell_NotifyIcon(NIM_DELETE, &m_nid); 5 return CDialog::DestroyWindow(); 6 }