系統托盤的製作步驟

首先建立 一個MFC對話框程序,我準備爲這個對話框程序製作一個托盤。
 1.實現將圖標放入系統托盤的功能。
(1)首先聲明一個全局變量 NOTIFYICONDATA nd
nd名字可以隨便起 就是在C工程名Dlg中右鍵增加成員變量,類型爲NOTIFYICONDATA 名字爲nd  屬性public
(2)然後同樣右鍵增加成員函數 ,新建一個AddIcon()函數,類型void 屬性public
增加後會讓你添加函數的代碼
void CMy5Dlg::AddIcon()
{
// 將圖標放入系統托盤
 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);     //增加托盤
}
(3)在C工程名Dlg類裏 

在OnInitDialog()裏面,return TRUE之前,添加: 

AddIcon();

這樣 托盤圖標就出現了
2.對托盤圖標的操作

(1)在CMyDlg類的頭文件中定義: 
//用戶定義的消息 
#define MYWM_NOTIFYICON WM_USER+1 

(2)

我們重載WindowProc()函數, 此外,我們還希望在主框架窗口最小化時圖標不在任務欄的空白區出現,在此函數中同時作相應處理。(重載WindowProc函數: 右鍵CMyDlg類->Add Virtual Function->選擇WindowProc->Add and Edit)

代碼如下
LRESULT CMy333Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
 // 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){
 SetForegroundWindow();  //這句代碼是當單擊窗體其他地方時候,下拉菜單消失
 //鼠標右鍵單擊彈出選單
  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;
  case WM_SYSCOMMAND:
   //如果是系統消息
   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);
}

4.添加菜單消息處理函數
在右鍵菜單中選擇一項後,就會發送命令消息WM_COMMAND,在ClassWizard裏添加WM_COMMAND的消息處理函數:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章