TrayIcon.cpp
上传用户:huaqiang
上传日期:2007-01-03
资源大小:19k
文件大小:7k
源码类别:

Email客户端

开发平台:

Visual C++

  1. /////////////////////////////////////////////////////////////////////////////
  2. // TrayIcon.cpp : implementation file
  3. //
  4. // This is a conglomeration of ideas from the MSJ "Webster" application,
  5. // sniffing round the online docs, and from other implementations such
  6. // as PJ Naughter's "CTrayIconifyIcon" (http://indigo.ie/~pjn/ntray.html)
  7. // especially the "CTrayIcon::OnTrayNotification" member function.
  8. //
  9. // This class is a light wrapper around the windows system tray stuff. It
  10. // adds an icon to the system tray with the specified ToolTip text and 
  11. // callback notification value, which is sent back to the Parent window.
  12. //
  13. // The tray icon can be instantiated using either the constructor or by
  14. // declaring the object and creating (and displaying) it later on in the
  15. // program. eg.
  16. //
  17. // CTrayIcon m_TrayIcon; // Member variable of some class
  18. //
  19. // ... 
  20. // // in some member function maybe...
  21. // m_TrayIcon.Create(pParentWnd, WM_MY_NOTIFY, "Click here", 
  22. //   hIcon, nTrayIconID);
  23. //
  24. // Clobbered together by Chris Maunder.
  25. // 
  26. //
  27. /////////////////////////////////////////////////////////////////////////////
  28. #include "stdafx.h"
  29. #include "TrayIcon.h"
  30. #ifdef _DEBUG
  31. #define new DEBUG_NEW
  32. #undef THIS_FILE
  33. static char THIS_FILE[] = __FILE__;
  34. #endif
  35. IMPLEMENT_DYNAMIC(CTrayIcon, CObject)
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CTrayIcon construction/creation/destruction
  38. CTrayIcon::CTrayIcon()
  39. {
  40. memset(&m_tnd, 0, sizeof(m_tnd));
  41. m_bEnabled = FALSE;
  42. m_bHidden  = FALSE;
  43. }
  44. CTrayIcon::CTrayIcon(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, 
  45.  HICON icon, UINT uID)
  46. {
  47. Create(pWnd, uCallbackMessage, szToolTip, icon, uID);
  48. m_bHidden = FALSE;
  49. }
  50. BOOL CTrayIcon::Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, 
  51.    HICON icon, UINT uID)
  52. {
  53. // this is only for Windows 95 (or higher)
  54. VERIFY(m_bEnabled = ( GetVersion() & 0xff ) >= 4);
  55. if (!m_bEnabled) return FALSE;
  56. //Make sure Notification window is valid
  57. VERIFY(m_bEnabled = (pWnd && ::IsWindow(pWnd->GetSafeHwnd())));
  58. if (!m_bEnabled) return FALSE;
  59. //Make sure we avoid conflict with other messages
  60. ASSERT(uCallbackMessage >= WM_USER);
  61. //Tray only supports tooltip text up to 64 characters
  62. ASSERT(_tcslen(szToolTip) <= 64);
  63. // load up the NOTIFYICONDATA structure
  64. m_tnd.cbSize = sizeof(NOTIFYICONDATA);
  65. m_tnd.hWnd  = pWnd->GetSafeHwnd();
  66. m_tnd.uID  = uID;
  67. m_tnd.hIcon  = icon;
  68. m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  69. m_tnd.uCallbackMessage = uCallbackMessage;
  70. strcpy (m_tnd.szTip, szToolTip);
  71. // Set the tray icon
  72. VERIFY(m_bEnabled = Shell_NotifyIcon(NIM_ADD, &m_tnd));
  73. return m_bEnabled;
  74. }
  75. CTrayIcon::~CTrayIcon()
  76. {
  77. RemoveIcon();
  78. }
  79. /////////////////////////////////////////////////////////////////////////////
  80. // CTrayIcon icon manipulation
  81. void CTrayIcon::MoveToRight()
  82. {
  83. HideIcon();
  84. ShowIcon();
  85. }
  86. void CTrayIcon::RemoveIcon()
  87. {
  88. if (!m_bEnabled) return;
  89. m_tnd.uFlags = 0;
  90.     Shell_NotifyIcon(NIM_DELETE, &m_tnd);
  91.     m_bEnabled = FALSE;
  92. }
  93. void CTrayIcon::HideIcon()
  94. {
  95. if (m_bEnabled && !m_bHidden) {
  96. m_tnd.uFlags = NIF_ICON;
  97. Shell_NotifyIcon (NIM_DELETE, &m_tnd);
  98. m_bHidden = TRUE;
  99. }
  100. }
  101. void CTrayIcon::ShowIcon()
  102. {
  103. if (m_bEnabled && m_bHidden) {
  104. m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  105. Shell_NotifyIcon(NIM_ADD, &m_tnd);
  106. m_bHidden = FALSE;
  107. }
  108. }
  109. BOOL CTrayIcon::SetIcon(HICON hIcon)
  110. {
  111. if (!m_bEnabled) return FALSE;
  112. m_tnd.uFlags = NIF_ICON;
  113. m_tnd.hIcon = hIcon;
  114. return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
  115. }
  116. BOOL CTrayIcon::SetIcon(LPCTSTR lpszIconName)
  117. {
  118. HICON hIcon = AfxGetApp()->LoadIcon(lpszIconName);
  119. return SetIcon(hIcon);
  120. }
  121. BOOL CTrayIcon::SetIcon(UINT nIDResource)
  122. {
  123. HICON hIcon = AfxGetApp()->LoadIcon(nIDResource);
  124. return SetIcon(hIcon);
  125. }
  126. BOOL CTrayIcon::SetStandardIcon(LPCTSTR lpIconName)
  127. {
  128. HICON hIcon = LoadIcon(NULL, lpIconName);
  129. return SetIcon(hIcon);
  130. }
  131. BOOL CTrayIcon::SetStandardIcon(UINT nIDResource)
  132. {
  133. HICON hIcon = LoadIcon(NULL, MAKEINTRESOURCE(nIDResource));
  134. return SetIcon(hIcon);
  135. }
  136.  
  137. HICON CTrayIcon::GetIcon() const
  138. {
  139. HICON hIcon = NULL;
  140. if (m_bEnabled)
  141. hIcon = m_tnd.hIcon;
  142. return hIcon;
  143. }
  144. /////////////////////////////////////////////////////////////////////////////
  145. // CTrayIcon tooltip text manipulation
  146. BOOL CTrayIcon::SetTooltipText(LPCTSTR pszTip)
  147. {
  148. if (!m_bEnabled) return FALSE;
  149. m_tnd.uFlags = NIF_TIP;
  150. _tcscpy(m_tnd.szTip, pszTip);
  151. return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
  152. }
  153. BOOL CTrayIcon::SetTooltipText(UINT nID)
  154. {
  155. CString strText;
  156. VERIFY(strText.LoadString(nID));
  157. return SetTooltipText(strText);
  158. }
  159. CString CTrayIcon::GetTooltipText() const
  160. {
  161. CString strText;
  162. if (m_bEnabled)
  163. strText = m_tnd.szTip;
  164. return strText;
  165. }
  166. /////////////////////////////////////////////////////////////////////////////
  167. // CTrayIcon notification window stuff
  168. BOOL CTrayIcon::SetNotificationWnd(CWnd* pWnd)
  169. {
  170. if (!m_bEnabled) return FALSE;
  171. //Make sure Notification window is valid
  172. ASSERT(pWnd && ::IsWindow(pWnd->GetSafeHwnd()));
  173. m_tnd.hWnd = pWnd->GetSafeHwnd();
  174. m_tnd.uFlags = 0;
  175. return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
  176. }
  177. CWnd* CTrayIcon::GetNotificationWnd() const
  178. {
  179. return CWnd::FromHandle(m_tnd.hWnd);
  180. }
  181. /////////////////////////////////////////////////////////////////////////////
  182. // CTrayIcon implentation of OnTrayNotification
  183. LRESULT CTrayIcon::OnTrayNotification(UINT wParam, LONG lParam) 
  184. {
  185. //Return quickly if its not for this tray icon
  186. if (wParam != m_tnd.uID)
  187. return 0L;
  188. CMenu menu, *pSubMenu;
  189. // Clicking with right button brings up a context menu
  190. if (LOWORD(lParam) == WM_RBUTTONUP)
  191. {
  192. if (!menu.LoadMenu(m_tnd.uID)) return 0;
  193. if (!(pSubMenu = menu.GetSubMenu(0))) return 0;
  194. // Make first menu item the default (bold font)
  195. ::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE);
  196. //Display and track the popup menu
  197. CPoint pos;
  198. GetCursorPos(&pos);
  199. ::SetForegroundWindow(m_tnd.hWnd);  
  200. ::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0, m_tnd.hWnd, NULL);
  201. //pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, this, NULL);
  202. menu.DestroyMenu();
  203. else if (LOWORD(lParam) == WM_LBUTTONDBLCLK) 
  204. {
  205. if (!menu.LoadMenu(m_tnd.uID)) return 0;
  206. if (!(pSubMenu = menu.GetSubMenu(0))) return 0;
  207. // double click received, the default action is to execute first menu item
  208. ::SetForegroundWindow(m_tnd.hWnd);
  209. ::SendMessage(m_tnd.hWnd, WM_COMMAND, pSubMenu->GetMenuItemID(0), 0);
  210. menu.DestroyMenu();
  211. }
  212. return 1;
  213. }