TrayIcon.cpp
上传用户:maryhy001
上传日期:2007-05-02
资源大小:2317k
文件大小:6k
源码类别:

网格计算

开发平台:

Visual C++

  1. /*
  2.   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  3. TrayIcon.cpp
  4. 版权:Devia@163.com 保留
  5. 描述:本程序主要完成程序任务栏的管理。
  6. 作者:李晓飞(Devia_Li) 2002.12.31
  7. 联系:Tel:13512524180 E_mail:Devia@163.net
  8.   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  9. */
  10.                    /////////////使 用 说 明//////////////
  11. /*
  12.   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  13.   类使用步骤:Create()-->
  14.               SetMenu()-->ModifyIcon()-->ModifyTipInfo()-->
  15.   SetActive()  //激活或关闭(退出应用程序时一定要关闭)
  16.   资源  准备:菜单,图标和提示字符串信息。
  17.   消息  影射:<1>
  18.                  在主框架头文件部分添加消息影射函数:
  19.                  LRESULT OnTrayNotification(WPARAM wparam, LPARAM lparam);
  20.                  //{{AFX_MSG(CMainFrame)
  21.              //}}AFX_MSG
  22.      但是该函数必须在//{{AFX_MSG(CMainFrame)和//}}AFX_MSG之外定义.
  23.   <2>
  24.      在主框架实现部分建立消息和影射函数之间的关系:
  25.  //{{AFX_MSG_MAP(CMainFrame)
  26.  ON_MESSAGE(DEFNM_TRAYICON, OnTrayNotification)
  27.  //}}AFX_MSG_MAP
  28.  其中DEFNM_TRAYICON就是我们自定义的CTrayIcon类的响应消息.
  29.   消息影射函数:
  30.   if ( wparam == GLOBAL_TRAYICON_ID )
  31.   {
  32. if ( lparam == WM_RBUTTONUP )
  33. {
  34. m_sysTrayIcon.PopupMenu();
  35. }
  36. else
  37. {
  38. if ( lparam == WM_LBUTTONDBLCLK )
  39. {
  40. if ( ::IsWindowVisible(m_sysTrayIcon.GetOwnerWnd()) )
  41. {
  42. m_sysTrayIcon.SetActive();
  43. ::ShowWindow(m_sysTrayIcon.GetOwnerWnd(), SW_HIDE);
  44. }
  45. else
  46. {
  47. m_sysTrayIcon.SetActive(FALSE);
  48. ::ShowWindow(m_sysTrayIcon.GetOwnerWnd(), SW_SHOW);
  49. }
  50. }
  51. }
  52. }
  53. return 1; 
  54. }
  55.   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  56. */
  57. #include "stdAfx.h"
  58. #include "TrayIcon.h"
  59. //######################################################################
  60. CTrayIcon::CTrayIcon()
  61. {
  62. //初始化Private变量
  63. hOwner = NULL;
  64. hPopMenu = NULL;
  65. //NOTIFYICONDATA结构体内容
  66. memset(&stData, 0, sizeof(NOTIFYICONDATA));
  67. stData.cbSize = sizeof(NOTIFYICONDATA);
  68. stData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
  69. //响应的自定义消息
  70. stData.uCallbackMessage = 0;
  71. stData.hWnd = NULL;;
  72. stData.hIcon = NULL;
  73. lstrcpy(stData.szTip, LPTSTR("高效,一流"));
  74. //活动状态
  75. bIsActivity = FALSE;
  76. }
  77. //######################################################################
  78. CTrayIcon::~CTrayIcon()
  79. {
  80. SetActive(FALSE);
  81. //释放菜单
  82. if ( hPopMenu != NULL )
  83. DestroyMenu( hPopMenu );
  84. }
  85. //######################################################################
  86. BOOL CTrayIcon::Create(HWND hOwnerWnd, UINT uID, HICON hIcon, LPTSTR szTip, UINT uMsg)
  87. {
  88. hOwner = hOwnerWnd;
  89. //初始化结构体内容
  90. stData.hWnd = hOwner;
  91. stData.uID = uID;
  92. stData.hIcon = hIcon;
  93. stData.uCallbackMessage = uMsg;
  94. //设置提示信息
  95. if ( szTip )
  96. lstrcpy(stData.szTip, szTip);
  97. return TRUE;
  98. }
  99. //######################################################################
  100. BOOL CTrayIcon::SetActive(BOOL bActivity )
  101. {
  102. BOOL bRet = FALSE;
  103. //打开和关闭CTrayIcon
  104. if ( bActivity == TRUE )
  105. {
  106. //如果打开CTrayIcon则向任务栏区添加图标
  107. bRet = Shell_NotifyIcon(NIM_ADD, &stData);
  108. ShowWindow(hOwner, SW_HIDE);
  109. }
  110. else
  111. {
  112. //如果关闭CTrayIcon则向任务栏区删除图标
  113. bRet = Shell_NotifyIcon(NIM_DELETE, &stData);
  114. ShowWindow(hOwner, SW_SHOW);
  115. }
  116. //同时设置当前打开关闭CTrayIcon标志
  117. bIsActivity = bActivity;
  118. return bRet;
  119. }
  120. //######################################################################
  121. BOOL CTrayIcon::SetMenu(HMENU hMenu)
  122. {
  123. if ( hPopMenu != hMenu && hMenu != NULL )
  124. {
  125. hPopMenu = hMenu;
  126. }
  127. return TRUE;
  128. }
  129. //######################################################################
  130. BOOL CTrayIcon::SetMenu(UINT uMenuID)
  131. {
  132. HINSTANCE hInstance;
  133. hInstance = (HINSTANCE)GetWindowLong( hOwner, GWL_HINSTANCE);
  134. hPopMenu = LoadMenu(hInstance, MAKEINTRESOURCE(uMenuID));
  135. return TRUE;
  136. }
  137. //######################################################################
  138. BOOL CTrayIcon::ModifyIcon(HICON hIcon)
  139. {
  140. //保留老的设置
  141. UINT uFlag = stData.uFlags;
  142. //重新设置HICON句柄(NIF_ICON仅仅使图标生效)
  143. stData.uFlags = NIF_ICON;
  144. stData.hIcon = hIcon;
  145. BOOL bRet = Shell_NotifyIcon(NIM_MODIFY, &stData);
  146. stData.uFlags = uFlag;
  147. return bRet;
  148. }
  149. //######################################################################
  150. BOOL CTrayIcon::ModifyIcon(UINT uResID)
  151. {
  152. HINSTANCE hInstance;
  153. hInstance = (HINSTANCE)GetWindowLong(hOwner, GWL_HINSTANCE);
  154. HICON hIcon;
  155. hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(uResID));
  156. BOOL bRet = ModifyIcon(hIcon);
  157. return bRet;
  158. }
  159. //######################################################################
  160. BOOL CTrayIcon::ModifyTipInfo(LPTSTR szTip)
  161. {
  162. //保留老的设置
  163. UINT uFlag = stData.uFlags;
  164. //重新设置HICON句柄(NIF_ICON仅仅使图标生效)
  165. stData.uFlags = NIF_TIP;
  166. lstrcpy(stData.szTip, szTip);
  167. BOOL bRet = Shell_NotifyIcon(NIM_MODIFY, &stData);
  168. stData.uFlags = uFlag;
  169. return bRet;
  170. }
  171. //######################################################################
  172. BOOL CTrayIcon::Refresh(void)
  173. {
  174. if(this->bIsActivity) {
  175. return Shell_NotifyIcon(NIM_MODIFY, &stData) || Shell_NotifyIcon(NIM_ADD, &stData);
  176. }
  177. return TRUE;
  178. }
  179. //######################################################################
  180. void CTrayIcon::PopupMenu()
  181. {
  182. if(!hPopMenu || !hOwner) return;
  183. ::SetForegroundWindow(hOwner);
  184. POINT pt;
  185. ::GetCursorPos(&pt);
  186. HMENU hSubMenu = ::GetSubMenu(hPopMenu, 0);
  187. TrackPopupMenu(hSubMenu, TPM_RIGHTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON,
  188. pt.x, pt.y, 0, hOwner, NULL);
  189. return ;
  190. }