TrayIcon.cpp
上传用户:guangzhiyw
上传日期:2007-01-09
资源大小:495k
文件大小:3k
源码类别:

ICQ/即时通讯

开发平台:

Visual C++

  1. // TrayIcon.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "TrayIcon.h"
  5. #include "GfxPopupMenu.h"
  6. #include "resource.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CTrayIcon
  14. IMPLEMENT_DYNCREATE(CTrayIcon, CCmdTarget)
  15. CTrayIcon::CTrayIcon()
  16. {
  17. //初始化NOTIFYICONDATA结构变量
  18. memset(&m_nid, 0 , sizeof(m_nid));
  19. m_nid.cbSize = sizeof(m_nid);
  20. }
  21. CTrayIcon::~CTrayIcon()
  22. {
  23. SetIcon(0,NULL); // 从系统托盘中删除图标
  24. }
  25. // 设定通知窗口,该窗口必须已被创建
  26. void CTrayIcon::SetNotificationWnd(CWnd* pNotifyWnd, UINT uCbMsg)
  27. {
  28.     ASSERT(pNotifyWnd==NULL || ::IsWindow(pNotifyWnd->GetSafeHwnd()));
  29.     m_nid.hWnd = pNotifyWnd->GetSafeHwnd();
  30.     ASSERT(uCbMsg==0 || uCbMsg>=WM_USER);
  31.     m_nid.uCallbackMessage = uCbMsg;
  32. }
  33. BOOL CTrayIcon::SetIcon(UINT uID,LPCSTR lpTip)
  34. HICON hicon=NULL;
  35. if (uID)
  36. {
  37. if(lpTip!=NULL)
  38. strcpy(m_nid.szTip,lpTip);
  39. hicon = AfxGetApp()->LoadIcon(uID);
  40. }
  41. UINT msg;
  42. m_nid.uFlags = 0;
  43. // 设定图标
  44. if (hicon)
  45. {
  46. // 判断是要在系统托盘中增加还是要删除图标
  47. msg = m_nid.hIcon ? NIM_MODIFY : NIM_ADD;
  48. m_nid.hIcon = hicon;
  49. m_nid.uFlags = NIF_ICON|NIF_MESSAGE;
  50. if(lpTip!=NULL)
  51. m_nid.uFlags|=NIF_TIP;
  52. else 
  53. { // 删除图标
  54. if (m_nid.hIcon==NULL)
  55. return TRUE;   //已被删除
  56. msg = NIM_DELETE;
  57. }
  58. BOOL bRet = Shell_NotifyIcon(msg, &m_nid);
  59. if (msg==NIM_DELETE || !bRet)
  60. m_nid.hIcon = NULL; 
  61. return bRet;
  62. }
  63. // 缺省事件处理程序,该程序处理鼠标右击及双击事件。
  64. LRESULT CTrayIcon::OnTrayNotification(WPARAM wID,LPARAM lEvent)
  65. {
  66. if (wID!=m_nid.uID ||(lEvent!=WM_RBUTTONUP && lEvent!=WM_LBUTTONDBLCLK && lEvent!=WM_LBUTTONDOWN))
  67. return 0;
  68. CMenu menu;
  69. CGfxPopupMenu cMenu;
  70. if(!menu.LoadMenu(IDR_MAINFRAME))
  71. return 0;
  72. if (lEvent==WM_RBUTTONUP) {
  73. cMenu.Attach(menu.GetSubMenu(0)->GetSafeHmenu());
  74. cMenu.LoadToolBarResource(IDR_TOOLBAR1);
  75. cMenu.RemapMenu(&cMenu);
  76. // 在鼠标的当前位置弹出菜单。
  77. CPoint mouse;
  78. GetCursorPos(&mouse);
  79. ::SetForegroundWindow(m_nid.hWnd); 
  80. ::TrackPopupMenu(cMenu.m_hMenu,
  81. 0,
  82. mouse.x,
  83. mouse.y,
  84. 0,
  85. m_nid.hWnd,
  86. NULL);
  87. }
  88. else if(lEvent==WM_LBUTTONDOWN)
  89. {
  90. cMenu.Attach(menu.GetSubMenu(1)->GetSafeHmenu());
  91. cMenu.LoadToolBarResource(IDR_TOOLBAR2);
  92. cMenu.RemapMenu(&cMenu);
  93. CPoint mouse;
  94. GetCursorPos(&mouse);
  95. ::SetForegroundWindow(m_nid.hWnd); 
  96. ::TrackPopupMenu(cMenu.m_hMenu,
  97. 0,
  98. mouse.x,
  99. mouse.y,
  100. 0,
  101. m_nid.hWnd,
  102. NULL);
  103. }
  104. else
  105. {
  106. ::SendMessage(m_nid.hWnd, WM_HOTKEY,1001, 0);
  107. }
  108. return 1; // 表示事件已被处理
  109. }
  110. /////////////////////////////////////////////////////////////////////////////
  111. // CTrayIcon message handlers