AnimateTray.cpp
上传用户:cn05999
上传日期:2020-06-29
资源大小:84k
文件大小:5k
源码类别:

Static控件

开发平台:

Visual C++

  1. // AnimateTray.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "CProgressCtrl.h"
  5. #include "AnimateTray.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAnimateTray
  13. CAnimateTray::CAnimateTray()
  14. {
  15. memset(&m_NotifyIconData,0,sizeof(m_NotifyIconData));
  16. m_bCreated=FALSE;
  17. m_bHidden=FALSE;
  18. m_pNotificationWnd=NULL;
  19. // m_bTimerOn=FALSE;
  20. m_bAnimated=FALSE;
  21. m_bMenuOn=FALSE;
  22. }
  23. CAnimateTray::~CAnimateTray()
  24. {
  25. // if(m_bTimerOn)
  26. KillTimer(m_nTimerID);
  27. RemoveIcon();
  28. }
  29. BEGIN_MESSAGE_MAP(CAnimateTray, CWnd)
  30. //{{AFX_MSG_MAP(CAnimateTray)
  31. ON_WM_TIMER()
  32. ON_WM_CREATE()
  33. ON_WM_DESTROY()
  34. //}}AFX_MSG_MAP
  35. END_MESSAGE_MAP()
  36. /////////////////////////////////////////////////////////////////////////////
  37. // CAnimateTray message handlers
  38. BOOL CAnimateTray::CreateTray(CWnd *pNotifyWnd, UINT uID, LPCTSTR pszTooltipText, HICON hIcon, UINT nNotifyMessage)
  39. {
  40. ASSERT(pNotifyWnd&&::IsWindow(pNotifyWnd->GetSafeHwnd()));
  41. m_pNotificationWnd=pNotifyWnd;
  42. ASSERT(nNotifyMessage>=WM_USER);
  43. m_NotifyIconData.cbSize=sizeof(m_NotifyIconData);
  44. m_NotifyIconData.hWnd=pNotifyWnd->GetSafeHwnd();
  45. m_NotifyIconData.uID=uID;
  46. m_NotifyIconData.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
  47. m_NotifyIconData.uCallbackMessage=nNotifyMessage;
  48. m_NotifyIconData.hIcon=hIcon;
  49. _tcscpy(m_NotifyIconData.szTip,pszTooltipText);
  50. BOOL rVal=Shell_NotifyIcon(NIM_ADD,&m_NotifyIconData);
  51. m_bCreated=rVal;
  52. return rVal;
  53. }
  54. BOOL CAnimateTray::CreateTray(CWnd *pNotifyWnd, UINT uID, LPCTSTR pszTooltipText, HICON *phIcons, int nNumIcons, DWORD dwDelay, UINT nNotifyMessage)
  55. {
  56. //窗体显示是否正常(隐藏)
  57. m_bIsWindowNormal=true;
  58. //至少2 个图标
  59. ASSERT(nNumIcons>=2);
  60. ASSERT(dwDelay);
  61. //时间触发器窗体,它封装了产生任务栏动画的代码
  62. m_nCurrentIconIndex=0;
  63. m_phIcons=new HICON[nNumIcons];
  64. memcpy(m_phIcons,phIcons,nNumIcons*sizeof(HICON));
  65. m_nNumIcons=nNumIcons;
  66. m_dwDelay=dwDelay;
  67. BOOL bSuccess=CreateTray(pNotifyWnd,uID,pszTooltipText,
  68. phIcons[0],nNotifyMessage);
  69. m_bAnimated=TRUE;
  70. // if(m_nTimerID=SetTimer(0,400,NULL))
  71. // AfxMessageBox("Failed to Set Timer");
  72. // else AfxMessageBox("Set Timer");
  73. return bSuccess;
  74. }
  75. void CAnimateTray::RemoveIcon()
  76. {
  77. if(m_bCreated)
  78. {
  79. m_NotifyIconData.uFlags=0;
  80. Shell_NotifyIcon(NIM_DELETE,&m_NotifyIconData);
  81. m_bCreated=FALSE;
  82. }
  83. }
  84. void CAnimateTray::OnTimer(UINT nIDEvent) 
  85. {
  86. // TODO: Add your message handler code here and/or call default
  87. if(nIDEvent==3)
  88. // AfxMessageBox("Timer is On");
  89. ++m_nCurrentIconIndex;
  90. m_nCurrentIconIndex=m_nCurrentIconIndex%m_nNumIcons;
  91. m_NotifyIconData.uFlags=NIF_ICON;
  92. m_NotifyIconData.hIcon=m_phIcons[m_nCurrentIconIndex];
  93. AfxGetMainWnd()->SetIcon(m_NotifyIconData.hIcon,FALSE);
  94. Shell_NotifyIcon(NIM_MODIFY,&m_NotifyIconData);
  95. CWnd::OnTimer(nIDEvent);
  96. }
  97. LRESULT CAnimateTray::OnTrayNotification(WPARAM wID, LPARAM lEvent)
  98. {
  99. if(wID!=m_NotifyIconData.uID)
  100. return 0L;
  101. CMenu menu;
  102. if(!menu.LoadMenu(wID))
  103. return 0;
  104. CMenu* pSubMenu=menu.GetSubMenu(0);
  105. if(!pSubMenu)
  106. return 0;
  107. //测试消息
  108. //可以在此添加其它的消息响应
  109. //该类仅仅封闭了WM_RBUTTONUP和WM_LBUTTONDBLCLK消息
  110. if(lEvent==WM_RBUTTONUP)
  111. {
  112. if(!m_bMenuOn)
  113. {
  114. ::SetMenuDefaultItem(pSubMenu->m_hMenu,0,TRUE);
  115. //显示并追踪鼠标信息
  116. CPoint pos;
  117. GetCursorPos(&pos);
  118. ::SetForegroundWindow(m_NotifyIconData.hWnd);
  119. ::TrackPopupMenu(pSubMenu->m_hMenu,0,pos.x,pos.y,0,m_NotifyIconData.hWnd,NULL);
  120. m_bMenuOn=TRUE;
  121. }
  122. else
  123. {
  124. CPoint pos;
  125. GetCursorPos(&pos);
  126. ::SetForegroundWindow(m_NotifyIconData.hWnd);
  127. ::TrackPopupMenu(NULL,0,pos.x,pos.y,0,m_NotifyIconData.hWnd,NULL);
  128. m_bMenuOn=FALSE;
  129. }
  130. }
  131. else if(lEvent==WM_LBUTTONDBLCLK)
  132. {
  133. if(!m_bIsWindowNormal)//将窗体激活
  134. ::SendMessage(m_NotifyIconData.hWnd,WM_COMMAND,pSubMenu->GetMenuItemID(0),0);
  135. else //将窗体隐藏
  136. ::SendMessage(m_NotifyIconData.hWnd,WM_COMMAND,pSubMenu->GetMenuItemID(1),0);
  137. }
  138. return 1;
  139. }
  140. int CAnimateTray::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  141. {
  142. if (CWnd::OnCreate(lpCreateStruct) == -1)
  143. return -1;
  144. // TODO: Add your specialized creation code here
  145. return 0;
  146. }
  147. void CAnimateTray::OnDestroy() 
  148. {
  149. CWnd::OnDestroy();
  150. // TODO: Add your message handler code here
  151. KillTimer(m_nTimerID);
  152. }
  153. BOOL CAnimateTray::SetIcon(HICON hIcon)
  154. {
  155. if(!m_bCreated)
  156. return FALSE;
  157. m_bAnimated=FALSE;
  158. m_NotifyIconData.uFlags=NIF_ICON;
  159. m_NotifyIconData.hIcon=hIcon;
  160. return  Shell_NotifyIcon(NIM_DELETE,&m_NotifyIconData);
  161. }
  162. BOOL CAnimateTray::SetIcon(UINT nIDResourec)
  163. {
  164. HICON  hIcon=LoadIcon(NULL,MAKEINTRESOURCE(nIDResourec));
  165. return SetIcon(hIcon);
  166. }
  167. BOOL CAnimateTray::SetIcon(LPCTSTR lpIconName)
  168. {
  169. HICON  hIcon=AfxGetApp()->LoadIcon(lpIconName);
  170. return SetIcon(hIcon);
  171. }
  172. BOOL CAnimateTray::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
  173. {
  174. // TODO: Add your specialized code here and/or call the base class
  175. return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
  176. }
  177. void CAnimateTray::OnTimer1(UINT nIDEvent)
  178. {
  179. OnTimer(nIDEvent);
  180. }