SystemTray.cpp
上传用户:kklily621
上传日期:2013-06-25
资源大小:252k
文件大小:5k
开发平台:

Visual C++

  1. //=============================================================================================
  2. /*
  3. 文件: SystemTray.cpp
  4. 说明:
  5. ---------------------------------------------------
  6. 在系统任务栏上显示图标。
  7. ---------------------------------------------------
  8. 工程: Xfilter 个人防火墙
  9. 作者: 朱雁辉,朱雁冰
  10. 创建日期: 2001/08/12
  11. 网址: http://www.xfilt.com
  12. 电子邮件: xstudio@xfilt.com
  13. 版权所有 (c) 2001-2002 X 工作室
  14. 警告:
  15. ---------------------------------------------------
  16. 本电脑程序受著作权法的保护。未经授权,不能使用
  17. 和修改本软件全部或部分源代码。凡擅自复制、盗用或散
  18. 布此程序或部分程序或者有其它任何越权行为,将遭到民
  19. 事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。
  20. 凡通过合法途径购买本软件源代码的用户被默认授权
  21. 可以在自己的程序中使用本软件的部分代码,但作者不对
  22. 代码产生的任何后果负责。
  23. 使用了本软件代码的程序只能以可执行文件形式发布,
  24. 未经特别许可,不能将含有本软件源代码的源程序以任何
  25. 形式发布。
  26. ---------------------------------------------------
  27. */
  28. //=============================================================================================
  29. #include "stdafx.h"
  30. #include "SystemTray.h"
  31. CSystemTray::CSystemTray()
  32. {
  33.     Initialise();
  34. }
  35. CSystemTray::CSystemTray(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szToolTip, 
  36.                          HICON icon, UINT uID)
  37. {
  38.     Initialise();
  39.     Create(pParent, uCallbackMessage, szToolTip, icon, uID);
  40. }
  41. void CSystemTray::Initialise()
  42. {
  43.     memset(&m_tnd, 0, sizeof(m_tnd));
  44.     m_bEnabled = FALSE;
  45.     m_bHidden = FALSE;
  46.     m_DefaultMenuItemID = 0;
  47.     m_DefaultMenuItemByPos = TRUE;
  48. }
  49. BOOL CSystemTray::Create(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szToolTip, 
  50.                          HICON icon, UINT uID)
  51. {
  52.     m_bEnabled = (GetVersion() & 0xff) >= 4;
  53.     if (!m_bEnabled) 
  54.     {
  55.         ASSERT(FALSE);
  56.         return FALSE;
  57.     }
  58.     ASSERT(uCallbackMessage >= WM_USER);
  59.     ASSERT(_tcslen(szToolTip) <= 64);
  60.     m_tnd.cbSize = sizeof(NOTIFYICONDATA);
  61.     m_tnd.hWnd   = pParent->GetSafeHwnd();
  62.     m_tnd.uID    = uID;
  63.     m_tnd.hIcon  = icon;
  64.     m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  65.     m_tnd.uCallbackMessage = uCallbackMessage;
  66.     _tcscpy(m_tnd.szTip, szToolTip);
  67.     m_bEnabled = Shell_NotifyIcon(NIM_ADD, &m_tnd);
  68.     ASSERT(m_bEnabled);
  69.     return m_bEnabled;
  70. }
  71. CSystemTray::~CSystemTray()
  72. {
  73.     RemoveIcon();
  74. }
  75. void CSystemTray::RemoveIcon()
  76. {
  77.     if (!m_bEnabled) return;
  78.     m_tnd.uFlags = 0;
  79.     Shell_NotifyIcon(NIM_DELETE, &m_tnd);
  80.     m_bEnabled = FALSE;
  81. }
  82. void CSystemTray::HideIcon()
  83. {
  84.     if (m_bEnabled && !m_bHidden) {
  85.         m_tnd.uFlags = NIF_ICON;
  86.         Shell_NotifyIcon (NIM_DELETE, &m_tnd);
  87.         m_bHidden = TRUE;
  88.     }
  89. }
  90. BOOL CSystemTray::SetIcon(UINT nIDResource)
  91. {
  92.     HICON hIcon = AfxGetApp()->LoadIcon(nIDResource);
  93.     if (!m_bEnabled) return FALSE;
  94.     m_tnd.uFlags = NIF_ICON;
  95.     m_tnd.hIcon = hIcon;
  96.     return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
  97. }
  98. BOOL CSystemTray::SetMenuDefaultItem(UINT uItem, BOOL bByPos)
  99. {
  100.     if ((m_DefaultMenuItemID == uItem) && (m_DefaultMenuItemByPos == bByPos)) 
  101.         return TRUE;
  102.     m_DefaultMenuItemID = uItem;
  103.     m_DefaultMenuItemByPos = bByPos;   
  104.     CMenu menu, *pSubMenu;
  105.     if (!menu.LoadMenu(m_tnd.uID))
  106.         return FALSE;
  107.     pSubMenu = menu.GetSubMenu(0);
  108.     if (!pSubMenu)
  109.         return FALSE;
  110.     ::SetMenuDefaultItem(pSubMenu->m_hMenu, m_DefaultMenuItemID, m_DefaultMenuItemByPos);
  111.     return TRUE;
  112. }
  113. LRESULT CSystemTray::OnTrayNotification(UINT wParam, LONG lParam) 
  114. {
  115.     if (wParam != m_tnd.uID)
  116.         return 0;
  117.     CMenu menu, *pSubMenu;
  118.     CWnd* pTarget = AfxGetMainWnd();
  119. static BOOL IsShowed = FALSE;
  120.     if (LOWORD(lParam) == WM_RBUTTONUP)
  121.     {    
  122.         if (!menu.LoadMenu(m_tnd.uID))
  123.             return 0;
  124.         
  125.         pSubMenu = menu.GetSubMenu(0);
  126.         if (!pSubMenu)
  127.             return 0;
  128.         ::SetMenuDefaultItem(pSubMenu->m_hMenu, m_DefaultMenuItemID, m_DefaultMenuItemByPos);
  129.         CPoint pos;
  130.         GetCursorPos(&pos);
  131.         pTarget->SetForegroundWindow();  
  132. IsShowed = TRUE;
  133.         ::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0, 
  134.                          pTarget->GetSafeHwnd(), NULL);
  135.   IsShowed = FALSE;
  136.         pTarget->PostMessage(WM_NULL, 0, 0);
  137.         menu.DestroyMenu();
  138.     } 
  139.     else if (LOWORD(lParam) == WM_LBUTTONDBLCLK) 
  140.     {
  141. if(IsShowed)
  142. return 0;
  143.         pTarget->SetForegroundWindow();  
  144.         UINT uItem;
  145.         if (m_DefaultMenuItemByPos)
  146.         {
  147.            if (!menu.LoadMenu(m_tnd.uID))
  148.                 return 0;
  149.             
  150.             pSubMenu = menu.GetSubMenu(0);
  151.             if (!pSubMenu)
  152.                 return 0;
  153.             
  154.             uItem = pSubMenu->GetMenuItemID(m_DefaultMenuItemID);
  155.         }
  156.         else
  157.             uItem = m_DefaultMenuItemID;
  158.         
  159.         pTarget->SendMessage(WM_COMMAND, uItem, 0);
  160.         menu.DestroyMenu();
  161.     }
  162.     return 1;
  163. }