在windows系统任务栏的托盘中显示图标 c++

来源:互联网 发布:java形参和实参的区别 编辑:程序博客网 时间:2024/04/29 07:12

 

  1. //在windows系统任务栏的托盘中显示图标
  2. //使用vc6.0++
  3. //代码改编自《TCP/IPX协议及网络编程技术》第22章,罗军舟等著,清华大学出版社
  4. //
  5. //    托盘指的是windows桌面窗口右下角显示图标的区域
  6. //    管理托盘图标的函数是Shell_NotifyIcon
  7. //    为了简化使用,定义了CyctNotifyIcon类,封装了Shell_NotifyIcon
  8. //    该类用于构建、维护任务栏图标,主要目的是为了用户提供基于任务
  9. //    栏图标的图形化使用界面。
  10. //========================================================
  11. //======yctNotifyIcon.h文件===================
  12. //注意:代码并不完整,只包含必需的代码
  13. class CyctNotifyIcon  
  14. {
  15. private:
  16.  NOTIFYICONDATA m_NotifyIconData;//NOTITYICONDAT结构
  17.     void FillNotifyIconData(UINT uIDResource, const char *chTip);
  18. public:
  19.  CyctNotifyIcon(HWND hWnd, UINT uCallbackMessage);
  20.  virtual ~CyctNotifyIcon();
  21.  void AddIcon(UINT uIDResource, const char *chTip); 
  22.  void ChangeIcon(UINT uIDResource, const char *chTip);
  23.  void DeleteIcon();
  24. };
  25. //========================================================
  26. //======yctNotifyIcon.cpp文件===================
  27. #include "stdafx.h"
  28. #include "yctNotifyIcon.h"
  29. CyctNotifyIcon::CyctNotifyIcon(HWND hWnd, UINT uCallbackMessage)
  30. {
  31. //hWnd: 指定使用任务栏托盘图标的应用程序的窗口句柄
  32. //uCallbackMessage: 指定任务栏托盘图标鼠标事件的用户回调消息;
  33. //   可以参考msdn中的NOTIFYICONDATA结构
  34.  memset(&m_NotifyIconData, 0, sizeof(NOTIFYICONDATA));
  35.  m_NotifyIconData.hWnd = hWnd;
  36.  ASSERT(m_NotifyIconData.hWnd != NULL);
  37.  m_NotifyIconData.uCallbackMessage = uCallbackMessage;
  38. }
  39. CyctNotifyIcon::~CyctNotifyIcon()
  40. {
  41. }
  42.     
  43. void CyctNotifyIcon::FillNotifyIconData(UINT uIDResource, const char *chTip)
  44. {
  45. //填充NOTITYICONDAT结构
  46. //uIDResource:指定图标资源ID
  47. //chTip:指定在托盘图标上显示的ToolTip文本
  48.  HICON hIcon = AfxGetApp()->LoadIcon(uIDResource);
  49.  m_NotifyIconData.cbSize = sizeof(NOTIFYICONDATA);
  50.  m_NotifyIconData.hIcon = hIcon;
  51.  sprintf(m_NotifyIconData.szTip,chTip);
  52.  m_NotifyIconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  53.  m_NotifyIconData.uID = uIDResource;
  54. }
  55. void CyctNotifyIcon::AddIcon(UINT uIDResource, const char *chTip)
  56. {
  57. //添加(在托盘中的)图标和ToolTip文本
  58. //uIDResource:指定图标资源ID
  59. //chTip:指定在图标上显示的ToolTip文本
  60.  FillNotifyIconData(uIDResource, chTip);
  61.  Shell_NotifyIcon(NIM_ADD, &m_NotifyIconData);
  62. }
  63. void CyctNotifyIcon::ChangeIcon(UINT uIDResource, const char *chTip)
  64. {
  65. //改变(在托盘中的)图标和ToolTip文本
  66. //uIDResource:指定图标资源ID
  67. //chTip:指定在图标上显示的ToolTip文本
  68.  FillNotifyIconData(uIDResource, chTip);
  69.  Shell_NotifyIcon(NIM_MODIFY, &m_NotifyIconData);
  70. }
  71. void CyctNotifyIcon::DeleteIcon()
  72. {
  73. //删除任务栏图标
  74.  Shell_NotifyIcon(NIM_DELETE, &m_NotifyIconData);
  75. }

 


使用示例步骤:

1)在CMainFrame中定义成员变量及构造函数中初始化:

  1. CyctNotifyIcon* m_pNotifyIcon;
  1. CMainFrame::CMainFrame()
  2. {
  3.  ......
  4.  m_pNotifyIcon = NULL;
  5.  ......
  6. }


2)自定义YCT_NOTIFY_ICON消息及其响应函数:

  1. #define  YCT_NOTIFY_ICON WM_USER+15 //自定义消息
  2. LRESULT CMainFrame::OnNotifyIcon( WPARAM wParam, LPARAM lParam )
  3. {
  4. //YCT_NOTIFY_ICON消息响应函数
  5. //用于响应任务栏图标的鼠标事件
  6. //wParam:任务栏图标的ID
  7. //lParam:鼠标事件值
  8. //附:此消息的触发来自于CMainFrame::OnCreate中CyctNotifyIcon构造函数的第二个参数的设定
  9.  switch(lParam)
  10.  {
  11.  case WM_RBUTTONUP:
  12.   //做自己想自己的事,如弹出右键菜单
  13.   ......
  14.   break;
  15.  case WM_LBUTTONDBLCLK:
  16.   //做自己想自己的事,如显示主窗口
  17.   ......
  18.   break;
  19.  default:
  20.   ;
  21.  }
  22.  return 0;
  23. }

 

3)(利用ClassWizard)重载OnCreate函数:

  1. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  2. {
  3.  ......
  4.  //显示windows任务栏图标
  5.  if(m_pNotifyIcon == NULL)
  6.  {
  7.   m_pNotifyIcon = new CyctNotifyIcon(this->GetSafeHwnd(),
  8.    YCT_NOTIFY_ICON); 
  9.   m_pNotifyIcon->AddIcon(IDR_MAINFRAME,(char *)YCT_TASKBAR_TOOLTIP_TEXT);
  10.  }
  11.  ......
  12. }

4)重载OnDestroy函数;目的:删除任务栏图标。

  1. void CMainFrame::OnDestroy() 
  2. {
  3.  CFrameWnd::OnDestroy();
  4.  ......
  5.  //删除windows任务栏图标
  6.  if(m_pNotifyIcon != NULL)
  7.   m_pNotifyIcon->DeleteIcon();
  8. }

5)在析构函数中释放m_pNotifyIcon:

  1. CMainFrame::~CMainFrame()
  2. {
  3.  ......
  4.  if(m_pNotifyIcon != NULL)
  5.   delete m_pNotifyIcon;
  6.  ......
  7. }

水平有限,如有错误请指正。

 

原创粉丝点击