MFC程序最小化到托盤

一、在資源中的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     }
相關文章
相關標籤/搜索