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

ICQ/即时通讯

开发平台:

Visual C++

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