分享

VC++如何在托盘区显示程序图标 >> 瀑布集

 伤心莫哭 2010-10-12

在全局头文件里面定义:

cpp代码
  1. #define WM_NOTIFYICON (WM_APP+100)  

1:初始化 

cpp代码
  1. //systray 通知    
  2.     NOTIFYICONDATA tnd;    
  3.     tnd.cbSize=sizeof(NOTIFYICONDATA);    
  4.     tnd.hWnd=this->m_hWnd;    
  5.     tnd.uID=IDR_MAINFRAME;    
  6.     tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;    
  7.     tnd.uCallbackMessage=WM_NOTIFYICON;    
  8.     tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));    
  9.     strcpy(tnd.szTip,"我的程序...");    
  10.     Shell_NotifyIcon(NIM_ADD,&tnd);    

2.当explorer退出重启时重新显示托盘区图标,如果不处理则不会显示 
重载回调函数DefWindowProc:

cpp代码
  1. LRESULT CMyDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)     
  2. {    
  3.     // TODO: Add your specialized code here and/or call the base class    
  4.     static UINT s_uTaskbarRestart;    
  5.     if (message == WM_CREATE)    
  6.         s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));            
  7.     if(message == s_uTaskbarRestart)    
  8.     {    
  9.         NOTIFYICONDATA tnd;    
  10.         tnd.cbSize=sizeof(NOTIFYICONDATA);    
  11.         tnd.hWnd=this->m_hWnd;    
  12.         tnd.uID=IDR_MAINFRAME;    
  13.         tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;    
  14.         tnd.uCallbackMessage=WM_NOTIFYICON;    
  15.         tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),    
  16.             MAKEINTRESOURCE(IDR_MAINFRAME));    
  17.         strcpy(tnd.szTip,"我的程序...");    
  18.         Shell_NotifyIcon(NIM_ADD,&tnd);    
  19.     }        
  20.     return CDialog::DefWindowProc(message, wParam, lParam);        

3.程序退出时托盘区图标处理,如果不处理,则托盘区仍然有该无意义的图标

cpp代码
  1. NOTIFYICONDATA tnid;    
  2. tnid.cbSize=sizeof(NOTIFYICONDATA);    
  3. tnid.hWnd=this->m_hWnd;    
  4. tnid.uID=IDR_MAINFRAME;    
  5. Shell_NotifyIcon(NIM_DELETE,&tnid);  

4.在托盘区图标上添加菜单 
可以添加一个下拉式菜单: 

cpp代码
  1. //头文件里面添加消息函数    :(注意添加位置,别搞错了)    
  2.     afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM lParam);    
  3.         
  4. //实现文件里面添加消息映射:(注意添加位置,别搞错了)    
  5.     ON_MESSAGE(WM_NOTIFYICON,OnNotifyIcon)    
  6.  
  7. //函数大概:    
  8. void CMyDlg::OnNotifyIcon(WPARAM wParam,LPARAM lParam)    
  9. {    
  10.     UINT uID=(UINT)wParam;    
  11.     UINT uMouseMsg=(UINT)lParam;    
  12.     if(uID==IDR_MAINFRAME)    
  13.     {    
  14.         CMenu menu;    
  15.         CMenu *pPopup;    
  16.         CPoint pt;    
  17.         switch(uMouseMsg)    
  18.         {    
  19.         case WM_RBUTTONDOWN:    
  20.             menu.LoadMenu(IDR_TrayMenu);//IDR_TrayMenu 为存在的一个下拉式菜单资源名    
  21.             pPopup=menu.GetSubMenu(0);    
  22.             GetCursorPos(&pt);    
  23.             pPopup->TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);    
  24.             break;    
  25.         case WM_LBUTTONDOWN:    
  26.             ShowWindow(SW_SHOWDEFAULT);        
  27.             /*    
  28.             menu.LoadMenu(IDR_TrayMenu);//IDR_TrayMenu 为存在的一个下拉式菜单资源名    
  29.             pPopup=menu.GetSubMenu(0);    
  30.             GetCursorPos(&pt);    
  31.             pPopup->TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);    
  32.             */    
  33.             break;    
  34.         }    
  35.     }    
  36. }    

实现菜单后,又可以对菜单的鼠标点击做出其他的动作,在此不在赘述。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多