GuiSysTray.cpp
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:5k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. /****************************************************************************
  2.  * *  
  3.  * GuiToolKit   *
  4.  *  (MFC extension) *  
  5.  * Created by Francisco Campos G. www.beyondata.com fcampos@beyondata.com *
  6.  *--------------------------------------------------------------------------*    
  7.  * *
  8.  * This program is free software;so you are free to use it any of your *
  9.  * applications (Freeware, Shareware, Commercial),but leave this header *
  10.  * intact. *
  11.  * *
  12.  * These files are provided "as is" without warranty of any kind. *
  13.  * *
  14.  *        GuiToolKit is forever FREE CODE !!!!! *
  15.  * *
  16.  *--------------------------------------------------------------------------*
  17.  * Created by: Francisco Campos G. *
  18.  * Bug Fixes and improvements : (Add your name) *
  19.  * -Francisco Campos *
  20.  * -Ernesto Garcia *
  21.  ****************************************************************************/
  22. #include "stdafx.h"
  23. #include "GuiLib.h"
  24. #include "guisystray.h"
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char THIS_FILE[]=__FILE__;
  28. #define new DEBUG_NEW
  29. #endif
  30. // CGuiSysTray
  31. IMPLEMENT_DYNAMIC(CGuiSysTray, CWnd)
  32. CGuiSysTray::CGuiSysTray()
  33. {
  34. memset(&tnid,sizeof(NOTIFYICONDATA),0x00);
  35. tnid.cbSize=sizeof(NOTIFYICONDATA);
  36. m_bStartAnimation=FALSE;
  37. m_ActualImage=0;
  38. m_pMenu=NULL;
  39. }
  40. CGuiSysTray::~CGuiSysTray()
  41. {
  42.     Del();
  43. }
  44. BEGIN_MESSAGE_MAP(CGuiSysTray, CWnd)
  45. ON_WM_TIMER()
  46. END_MESSAGE_MAP()
  47. // CGuiSysTray message handlers
  48. void CGuiSysTray::StartAnimation(int nMilliseconds,int nPosInit, int nPosEnd)
  49. {
  50. if(m_bStartAnimation)
  51. return;
  52. m_bStartAnimation=TRUE;
  53. m_ActualImage=nPosInit;
  54. m_Init=nPosInit;
  55. m_End=nPosEnd;
  56. SetTimer(156,100,0);
  57. }
  58. void CGuiSysTray::StopAnimation()
  59. {
  60. KillTimer(156);
  61. m_ActualImage=m_End=m_Init=0;
  62. }
  63. BOOL CGuiSysTray::Add(UINT uID,UINT uCallBackMessage, HICON hIcon, LPCTSTR lpszTip)
  64. {
  65.   tnid.uID = uID;
  66.   tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
  67.   tnid.uCallbackMessage = uCallBackMessage;
  68.   tnid.hIcon = hIcon;
  69.   _tcsncpy(tnid.szTip,lpszTip,sizeof(tnid.szTip)-1);
  70.   return (Shell_NotifyIcon(NIM_ADD, &tnid));
  71. }
  72. BOOL CGuiSysTray::Update(UINT uID, HICON hIcon, LPCTSTR lpszTip)
  73. {
  74.   tnid.hIcon = hIcon;
  75.   _tcsncpy(tnid.szTip,lpszTip,sizeof(tnid.szTip)-1);
  76.   return (Shell_NotifyIcon(NIM_MODIFY, &tnid));
  77. }
  78. BOOL CGuiSysTray::Del()
  79. {
  80.   return(Shell_NotifyIcon(NIM_DELETE, &tnid));
  81. }
  82. BOOL CGuiSysTray::SetIcon(HICON hIcon)
  83. {
  84.   tnid.hIcon = hIcon;
  85.   tnid.uFlags |= NIF_ICON;
  86.   return (Shell_NotifyIcon(NIM_MODIFY, &tnid));
  87. }
  88. BOOL CGuiSysTray::SetIcon(LPCTSTR lpszIcon)
  89. {
  90. return SetIcon(AfxGetApp()->LoadIcon(lpszIcon));
  91. }
  92. BOOL CGuiSysTray::SetTips(LPCTSTR lpszTip)
  93. {
  94.   tnid.uFlags |= NIF_TIP;
  95.   _tcsncpy(tnid.szTip,lpszTip,sizeof(tnid.szTip)-1);
  96.   return (Shell_NotifyIcon(NIM_MODIFY, &tnid));
  97. }
  98. void CGuiSysTray::SetImageList(UINT nBitmapID, int cx, int nGrow, COLORREF crMask)
  99. {
  100. CBitmap cbmp;
  101. BITMAP bmp;
  102. m_ImgList.Create(nBitmapID,cx,nGrow,crMask);
  103. cbmp.LoadBitmap(nBitmapID);
  104. cbmp.GetBitmap(&bmp);
  105. m_ImgList.Add(&cbmp,crMask);
  106. }
  107. BOOL CGuiSysTray::Create(CWnd* pParentWnd, UINT nID,UINT uCallBackMessage, HICON hIcon, LPCTSTR lpszTip)
  108. {
  109. // TODO: Add your specialized code here and/or call the base class
  110. ASSERT(pParentWnd->GetSafeHwnd());
  111. CWnd::CreateEx(0, AfxRegisterWndClass(0),_T(""), WS_POPUP, CRect(0,0,1,1), pParentWnd, 0);
  112. tnid.hWnd = GetSafeHwnd();
  113. if(Add(nID,uCallBackMessage,hIcon,lpszTip))
  114. return TRUE;
  115. else
  116. return TRUE;
  117. }
  118. void CGuiSysTray::SetSysMenu(CMenu* pMenu)
  119. {
  120. ASSERT(pMenu->GetSafeHmenu());
  121. m_pMenu=pMenu;
  122. }
  123. LRESULT CGuiSysTray::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  124. {
  125.     if (message== tnid.uCallbackMessage)
  126.     { 
  127.         if (LOWORD(lParam) == WM_RBUTTONUP)
  128.        {
  129.             if(m_pMenu == NULL) return FALSE;
  130.            CPoint pt;
  131.           GetCursorPos(&pt);
  132.            m_pMenu->GetSubMenu(0)->TrackPopupMenu(0, pt.x, pt.y, GetParent(), NULL);
  133.         }
  134.         //ERNESTO -> This portion of code was outside the if (message== tnid.uCallbackMessage), so it was never reached and double-click was never sent.
  135.         else if (LOWORD(lParam) == WM_LBUTTONDBLCLK) 
  136.             GetParent()->SendMessage(WM_LBUTTONDBLCLK,0, 0);
  137.     }
  138.     else
  139.         return CWnd::WindowProc(message, wParam, lParam);
  140.     return TRUE;
  141. }
  142. void CGuiSysTray::OnTimer(UINT nIDEvent)
  143. {
  144. // TODO: Add your message handler code here and/or call default
  145. if (nIDEvent == 156)
  146. {
  147. if (m_ActualImage > m_End)
  148. m_ActualImage=m_Init;
  149. SetIcon(m_ImgList.ExtractIcon(m_ActualImage));
  150. m_ActualImage++;
  151. }
  152. CWnd::OnTimer(nIDEvent);
  153. }