SystemTray.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:4k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // SystemTray.cpp: implementation of the CSystemTray class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "testbt.h"
  6. #include "SystemTray.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CSystemTray::CSystemTray()
  16. {
  17.     m_bEnabled   = FALSE;
  18.     m_bHidden    = FALSE;
  19.     memset(&m_tnd, 0, sizeof(m_tnd));
  20.     m_DefaultMenuItemID = 0;
  21.     m_DefaultMenuItemByPos = TRUE;
  22. }
  23. CSystemTray::~CSystemTray()
  24. {
  25.     RemoveIcon();
  26. }
  27. BOOL CSystemTray::Create(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szToolTip, 
  28.                          HICON icon, UINT uID)
  29. {
  30.     // this is only for Windows 95 (or higher)
  31.     VERIFY(m_bEnabled = ( GetVersion() & 0xff ) >= 4);
  32.     if (!m_bEnabled) return FALSE;
  33.     // Make sure Notification window is valid (not needed - CJM)
  34.     VERIFY(m_bEnabled = (pParent && ::IsWindow(pParent->GetSafeHwnd())));
  35.     // if (!m_bEnabled) return FALSE;
  36.     
  37.     // Make sure we avoid conflict with other messages
  38.     ASSERT(uCallbackMessage >= WM_USER);
  39.     // Tray only supports tooltip text up to 64 characters
  40.     ASSERT(_tcslen(szToolTip) <= 64);
  41.     // Create an invisible window
  42.     // CWnd::CreateEx(0, AfxRegisterWndClass(0), _T(""), WS_POPUP, 0,0,10,10, NULL, 0);
  43.     // load up the NOTIFYICONDATA structure
  44.     m_tnd.cbSize = sizeof(NOTIFYICONDATA);
  45.     m_tnd.hWnd   = pParent->GetSafeHwnd();
  46.     m_tnd.uID    = uID;
  47.     m_tnd.hIcon  = icon;
  48.     m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  49.     m_tnd.uCallbackMessage = uCallbackMessage;
  50.     _tcscpy(m_tnd.szTip, szToolTip);
  51.     // Set the tray icon
  52.     VERIFY(m_bEnabled = Shell_NotifyIcon(NIM_ADD, &m_tnd));
  53.     return m_bEnabled;
  54. }
  55. void CSystemTray::MoveToRight()
  56. {
  57.     HideIcon();
  58.     ShowIcon();
  59. }
  60. void CSystemTray::RemoveIcon()
  61. {
  62.     if (!m_bEnabled) return;
  63.     m_tnd.uFlags = 0;
  64.     Shell_NotifyIcon(NIM_DELETE, &m_tnd);
  65.     m_bEnabled = FALSE;
  66. }
  67. void CSystemTray::HideIcon()
  68. {
  69.     if (m_bEnabled && !m_bHidden) {
  70.         m_tnd.uFlags = NIF_ICON;
  71.         Shell_NotifyIcon (NIM_DELETE, &m_tnd);
  72.         m_bHidden = TRUE;
  73.     }
  74. }
  75. void CSystemTray::ShowIcon()
  76. {
  77.     if (m_bEnabled && m_bHidden) {
  78.         m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
  79.         Shell_NotifyIcon(NIM_ADD, &m_tnd);
  80.         m_bHidden = FALSE;
  81.     }
  82. }
  83. BOOL CSystemTray::SetTooltipText(LPCTSTR pszTip)
  84. {
  85.     if (!m_bEnabled) return FALSE;
  86.     m_tnd.uFlags = NIF_TIP;
  87.     _tcscpy(m_tnd.szTip, pszTip);
  88.     return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
  89. }
  90. LRESULT CSystemTray::OnTrayNotification(UINT wParam, LONG lParam) 
  91. {
  92.     //Return quickly if its not for this tray icon
  93.     if (wParam != m_tnd.uID)
  94.         return 0L;
  95.     CMenu menu, *pSubMenu;
  96.     CWnd* pTarget = AfxGetMainWnd();
  97.     // Clicking with right button brings up a context menu
  98.     if (LOWORD(lParam) == WM_RBUTTONUP)
  99.     {    
  100.         if (!menu.LoadMenu(m_tnd.uID)) return 0;
  101.         if (!(pSubMenu = menu.GetSubMenu(0))) return 0;
  102.         // Make chosen menu item the default (bold font)
  103.         ::SetMenuDefaultItem(pSubMenu->m_hMenu, m_DefaultMenuItemID, m_DefaultMenuItemByPos);
  104.         // Display and track the popup menu
  105.         CPoint pos;
  106.         GetCursorPos(&pos);
  107.         pTarget->SetForegroundWindow();  
  108.         ::TrackPopupMenu(pSubMenu->m_hMenu, TPM_LEFTALIGN |TPM_RIGHTBUTTON, pos.x, pos.y, 0, 
  109.                          pTarget->GetSafeHwnd(), NULL);
  110.         // BUGFIX: See "PRB: Menus for Notification Icons Don't Work Correctly"
  111.         pTarget->PostMessage(WM_NULL, 0, 0);
  112.         menu.DestroyMenu();
  113.     } 
  114.     else if (LOWORD(lParam) == WM_LBUTTONDBLCLK) 
  115.     {
  116.         // double click received, the default action is to execute default menu item
  117.         pTarget->SetForegroundWindow();  
  118.         UINT uItem;
  119.         if (m_DefaultMenuItemByPos)
  120.         {
  121.             if (!menu.LoadMenu(m_tnd.uID)) return 0;
  122.             if (!(pSubMenu = menu.GetSubMenu(0))) return 0;
  123.             uItem = pSubMenu->GetMenuItemID(m_DefaultMenuItemID);
  124.         }
  125.         else
  126.             uItem = m_DefaultMenuItemID;
  127.         
  128.         pTarget->SendMessage(WM_COMMAND, uItem, 0);
  129.         menu.DestroyMenu();
  130.     }
  131.     return 1;
  132. }