vC++ 系統托盤表徵圖實現

來源:互聯網
上載者:User
來自: http://blog.csdn.net/xian0617/article/details/5873248        C++ 系統托盤表徵圖實現               分類:           
我的C++曆程2010-09-09 14:00281人閱讀評論(3)收藏舉報

    工作列的右邊(托盤)常駐幾個表徵圖,如IME切換表徵圖、音量控製圖標等,此外我們還經常遇到擁有托盤表徵圖的軟體,如金山詞霸、有即時監測功能的殺毒軟體等。這些軟體在後台運行,通常不佔用太多的螢幕資源,只在通知欄上放一個小小的標誌。必要時我們可以通過用滑鼠點擊表徵圖對其進行菜單操作或啟用其主視窗。有時我們自己編寫的程式也希望有類似的效果,本文詳細地介紹用VC++6.0設計這種托盤表徵圖程式的方法。
     

---- NOTIFYICONDATA結構包含了系統用來處理托盤表徵圖的資訊,它包括選擇的表徵圖、回調訊息、提示訊息、表徵圖對應的視窗等內容。其定義為:

[cpp]
view plaincopyprint?

  1. //系統定義結構體 
  2. typedef struct _NOTIFYICONDATA     
  3. {     
  4.  DWORD cbSize; //以位元組為單位的這個結構的大小  
  5.  HWND hWnd; //接收托盤表徵圖通知訊息的視窗控制代碼  
  6.  UINT uID; //應用程式定義的該表徵圖的ID號  
  7.  UINT uFlags; //設定該表徵圖的屬性  
  8.  UINT uCallbackMessage; //應用程式定義的訊息ID號,此訊息傳遞給hWnd  
  9.  HICON hIcon; //表徵圖的控制代碼  
  10.  char szTip[64]; //滑鼠停留在表徵圖上顯示的提示資訊  
  11. } NOTIFYICONDATA, *PNOTIFYICONDATA; 
  12.  
  13. /*
  14. 該結構中,成員uFlags可以使下列之一或組合:
  15.    NIF_ICON 設定成員hIcon有效
  16.    NIF_MESSAGE 設定成員uCallbackMessage有效
  17.    NIF_TIP 設定成員szTip有效
  18. */ 

Shell_NotifyIcon函數

---- 全域函數Shell_NotifyIcon()用於在托盤上增加、刪除或修改表徵圖。其原型為:

[cpp]
view plaincopyprint?

  1. WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid); 
  2. /*
  3. ---Pnid是NOTIFYICONDATA結構的指標; dwMessage是被傳遞的訊息,可以是以下訊息之一: 
  4.    NIM_ADD 增加表徵圖
  5.    NIM_DELETE 刪除表徵圖
  6.    NIM_MODIFY 修改表徵圖
  7. */ 

使用執行個體

1) 在所要處理的Frame或Dialog中添加保護成員變數

[cpp]
view plaincopyprint?

  1. protected: 
  2.     NOTIFYICONDATA m_tnid; 

2) 為對應的Frame 或Dialog 添加 WM_CREATE 訊息函數,在對應實現函數中添加托盤產生代碼

在對應的類聲明檔案中定義訊息 ,並在OnCreate 函數中Return 之前添加代碼

[cpp]
view plaincopyprint?

  1. //對應的類聲明檔案中定義訊息 
  2. #define MYWM_NOTIFYICON WM_USER+1 
  3.  
  4. //OnCreate 函數中return 之前添加托盤產生代碼 
  5. m_tnid.cbSize=sizeof(NOTIFYICONDATA);  
  6. m_tnid.hWnd=this->m_hWnd;  
  7. m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;  
  8. m_tnid.uCallbackMessage=MYWM_NOTIFYICON;     
  9. //使用者定義的回調訊息  
  10. CString szToolTip;  
  11. szToolTip=_T("托盤表徵圖執行個體"); //滑鼠在托盤上移動時顯示文本 
  12. _tcscpy(m_tnid.szTip, szToolTip);  
  13. m_tnid.uID=IDR_MAINFRAME;  
  14. HICON hIcon;  
  15. hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);  
  16. m_tnid.hIcon=hIcon;  
  17. ::Shell_NotifyIcon(NIM_ADD,&m_tnid);  
  18. if(hIcon)::DestroyIcon(hIcon); 

3) 編寫訊息處理函數

----為了處理表徵圖回調訊息,如滑鼠左鍵雙擊、滑鼠右鍵單擊訊息,我們重載WindowProc()函數。此外,我們還希望在主架構視窗最小化時表徵圖不在工作列空白區出現,在此函數中同時作相應處理。

別忘了編輯屬於你自己的菜單,這裡暫且使用 IDR_RIGHT_MENU
標誌

[cpp]
view plaincopyprint?

  1. LRESULT ***Frame/*or Dialog*/::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)     
  2. {  
  3.  switch(message){  
  4.   case MYWM_NOTIFYICON:     
  5.    //如果是使用者定義的訊息  
  6.    if(lParam==WM_LBUTTONDBLCLK)  
  7.    {  
  8.     //滑鼠雙擊時主視窗出現  
  9.     AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);  
  10.    }  
  11.    else if(lParam==WM_RBUTTONDOWN){     
  12.     //滑鼠右鍵單擊快顯功能表  
  13.     CMenu menu;  
  14.     menu.LoadMenu(IDR_RIGHT_MENU);     
  15.     //載入事先定義的菜單  
  16.     CMenu* pMenu=menu.GetSubMenu(0);  
  17.     CPoint pos;  
  18.     GetCursorPos(&pos);  
  19.     pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());  
  20.    }  
  21.    break;  
  22.   case WM_SYSCOMMAND:     
  23.    //如果是系統訊息  
  24.         switch(wParam){ 
  25.           case SC_MINIMIZE: 
  26.               //接收到最小化訊息時主視窗隱藏  
  27.               ShowWindow(SW_HIDE);  
  28.               return 0; 
  29.               break; 
  30.           case SC_CLOSE : 
  31.               ::Shell_NotifyIcon(NIM_DELETE,&m_nid); //關閉時刪除系統托盤表徵圖 
  32.               break; 
  33.         }  
  34.    break;  
  35.  }  
  36.  return CFrameWnd/*or CDialog*/::WindowProc(message, wParam, lParam);  //其實就是調用父類的訊息處理函數 

至此,托盤表徵圖程式的常規功能我們均已實現。我們還可以通過Shell_NotifyIcon()函數的調用實現不同狀態標的改變,

    工作列的右邊(托盤)常駐幾個表徵圖,如IME切換表徵圖、音量控製圖標等,此外我們還經常遇到擁有托盤表徵圖的軟體,如金山詞霸、有即時監測功能的殺毒軟體等。這些軟體在後台運行,通常不佔用太多的螢幕資源,只在通知欄上放一個小小的標誌。必要時我們可以通過用滑鼠點擊表徵圖對其進行菜單操作或啟用其主視窗。有時我們自己編寫的程式也希望有類似的效果,本文詳細地介紹用VC++6.0設計這種托盤表徵圖程式的方法。
     

---- NOTIFYICONDATA結構包含了系統用來處理托盤表徵圖的資訊,它包括選擇的表徵圖、回調訊息、提示訊息、表徵圖對應的視窗等內容。其定義為:

[cpp]
view plaincopyprint?

  1. //系統定義結構體 
  2. typedef struct _NOTIFYICONDATA     
  3. {     
  4.  DWORD cbSize; //以位元組為單位的這個結構的大小  
  5.  HWND hWnd; //接收托盤表徵圖通知訊息的視窗控制代碼  
  6.  UINT uID; //應用程式定義的該表徵圖的ID號  
  7.  UINT uFlags; //設定該表徵圖的屬性  
  8.  UINT uCallbackMessage; //應用程式定義的訊息ID號,此訊息傳遞給hWnd  
  9.  HICON hIcon; //表徵圖的控制代碼  
  10.  char szTip[64]; //滑鼠停留在表徵圖上顯示的提示資訊  
  11. } NOTIFYICONDATA, *PNOTIFYICONDATA; 
  12.  
  13. /*
  14. 該結構中,成員uFlags可以使下列之一或組合:
  15.    NIF_ICON 設定成員hIcon有效
  16.    NIF_MESSAGE 設定成員uCallbackMessage有效
  17.    NIF_TIP 設定成員szTip有效
  18. */ 

Shell_NotifyIcon函數

---- 全域函數Shell_NotifyIcon()用於在托盤上增加、刪除或修改表徵圖。其原型為:

[cpp]
view plaincopyprint?

  1. WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid); 
  2. /*
  3. ---Pnid是NOTIFYICONDATA結構的指標; dwMessage是被傳遞的訊息,可以是以下訊息之一: 
  4.    NIM_ADD 增加表徵圖
  5.    NIM_DELETE 刪除表徵圖
  6.    NIM_MODIFY 修改表徵圖
  7. */ 

使用執行個體

1) 在所要處理的Frame或Dialog中添加保護成員變數

[cpp]
view plaincopyprint?

  1. protected: 
  2.     NOTIFYICONDATA m_tnid; 

2) 為對應的Frame 或Dialog 添加 WM_CREATE 訊息函數,在對應實現函數中添加托盤產生代碼

在對應的類聲明檔案中定義訊息 ,並在OnCreate 函數中Return 之前添加代碼

[cpp]
view plaincopyprint?

  1. //對應的類聲明檔案中定義訊息 
  2. #define MYWM_NOTIFYICON WM_USER+1 
  3.  
  4. //OnCreate 函數中return 之前添加托盤產生代碼 
  5. m_tnid.cbSize=sizeof(NOTIFYICONDATA);  
  6. m_tnid.hWnd=this->m_hWnd;  
  7. m_tnid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;  
  8. m_tnid.uCallbackMessage=MYWM_NOTIFYICON;     
  9. //使用者定義的回調訊息  
  10. CString szToolTip;  
  11. szToolTip=_T("托盤表徵圖執行個體"); //滑鼠在托盤上移動時顯示文本 
  12. _tcscpy(m_tnid.szTip, szToolTip);  
  13. m_tnid.uID=IDR_MAINFRAME;  
  14. HICON hIcon;  
  15. hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);  
  16. m_tnid.hIcon=hIcon;  
  17. ::Shell_NotifyIcon(NIM_ADD,&m_tnid);  
  18. if(hIcon)::DestroyIcon(hIcon); 

3) 編寫訊息處理函數

----為了處理表徵圖回調訊息,如滑鼠左鍵雙擊、滑鼠右鍵單擊訊息,我們重載WindowProc()函數。此外,我們還希望在主架構視窗最小化時表徵圖不在工作列空白區出現,在此函數中同時作相應處理。

別忘了編輯屬於你自己的菜單,這裡暫且使用 IDR_RIGHT_MENU
標誌

[cpp]
view plaincopyprint?

  1. LRESULT ***Frame/*or Dialog*/::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)     
  2. {  
  3.  switch(message){  
  4.   case MYWM_NOTIFYICON:     
  5.    //如果是使用者定義的訊息  
  6.    if(lParam==WM_LBUTTONDBLCLK)  
  7.    {  
  8.     //滑鼠雙擊時主視窗出現  
  9.     AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOW);  
  10.    }  
  11.    else if(lParam==WM_RBUTTONDOWN){     
  12.     //滑鼠右鍵單擊快顯功能表  
  13.     CMenu menu;  
  14.     menu.LoadMenu(IDR_RIGHT_MENU);     
  15.     //載入事先定義的菜單  
  16.     CMenu* pMenu=menu.GetSubMenu(0);  
  17.     CPoint pos;  
  18.     GetCursorPos(&pos);  
  19.     pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd());  
  20.    }  
  21.    break;  
  22.   case WM_SYSCOMMAND:     
  23.    //如果是系統訊息  
  24.         switch(wParam){ 
  25.           case SC_MINIMIZE: 
  26.               //接收到最小化訊息時主視窗隱藏  
  27.               ShowWindow(SW_HIDE);  
  28.               return 0; 
  29.               break; 
  30.           case SC_CLOSE : 
  31.               ::Shell_NotifyIcon(NIM_DELETE,&m_nid); //關閉時刪除系統托盤表徵圖 
  32.               break; 
  33.         }  
  34.    break;  
  35.  }  
  36.  return CFrameWnd/*or CDialog*/::WindowProc(message, wParam, lParam);  //其實就是調用父類的訊息處理函數 

至此,托盤表徵圖程式的常規功能我們均已實現。我們還可以通過Shell_NotifyIcon()函數的調用實現不同狀態標的改變,

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.