SystemIcon.cpp
上传用户:czfddz
上传日期:2013-03-20
资源大小:1517k
文件大小:6k
源码类别:

酒店行业

开发平台:

C/C++

  1. // SystemIcon.cpp: implementation of the CSystemIcon class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "SystemIcon.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. //////////////////////////////////////////////////////////////////////
  12. // Construction/Destruction
  13. //////////////////////////////////////////////////////////////////////
  14. IMPLEMENT_DYNAMIC(CSystemIcon, CObject) 
  15. CSystemIcon::CSystemIcon()
  16. {
  17.      memset(&m_tnd, 0, sizeof(m_tnd)); 
  18.     m_bEnabled = FALSE; 
  19.     m_bHidden  = FALSE;   
  20. }
  21. CSystemIcon::CSystemIcon(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, 
  22.                      HICON icon, UINT uID) 
  23.  
  24.     Create(pWnd, uCallbackMessage, szToolTip, icon, uID); 
  25.     m_bHidden = FALSE; 
  26. CSystemIcon::~CSystemIcon()
  27. {
  28. DeleteIcon(); 
  29. }
  30. BOOL CSystemIcon::Create(CWnd* pWnd, UINT uCallbackMessage, LPCTSTR szToolTip, 
  31.                        HICON icon, UINT uID) 
  32.     //文件只能使用在WINDOW 95以上的版本中 
  33.     VERIFY(m_bEnabled = ( GetVersion() & 0xff ) >= 4); 
  34.     if (!m_bEnabled) return FALSE; 
  35.     //确认通知窗口有效 
  36.     VERIFY(m_bEnabled = (pWnd && ::IsWindow(pWnd->GetSafeHwnd()))); 
  37.     if (!m_bEnabled) return FALSE; 
  38.     //确认自定义消息大于WM_USER 
  39.     ASSERT(uCallbackMessage >= WM_USER); 
  40.     //确定提示文本长度小于64 
  41.     ASSERT(_tcslen(szToolTip) <= 64); 
  42.     //定义NOTIFYICONDATA结构的数据项 
  43.     m_tnd.cbSize = sizeof(NOTIFYICONDATA); 
  44.     m_tnd.hWnd     = pWnd->GetSafeHwnd(); 
  45.     m_tnd.uID     = uID; 
  46.     m_tnd.hIcon  = icon; 
  47.     m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
  48.     m_tnd.uCallbackMessage = uCallbackMessage; 
  49.     strcpy (m_tnd.szTip, szToolTip); 
  50.     //设置图标 
  51.     VERIFY(m_bEnabled = Shell_NotifyIcon(NIM_ADD, &m_tnd)); 
  52.     return m_bEnabled; 
  53. void CSystemIcon::DeleteIcon() 
  54.     if (!m_bEnabled) return; 
  55.   
  56.     m_tnd.uFlags = 0; 
  57.     Shell_NotifyIcon(NIM_DELETE, &m_tnd); 
  58.     m_bEnabled = FALSE; 
  59.   
  60. void CSystemIcon::HideIcon() 
  61.     if (m_bEnabled && !m_bHidden) { 
  62.         m_tnd.uFlags = NIF_ICON; 
  63.         Shell_NotifyIcon (NIM_DELETE, &m_tnd); 
  64.         m_bHidden = TRUE; 
  65.     } 
  66.   
  67. void CSystemIcon::ShowIcon() 
  68.     if (m_bEnabled && m_bHidden) { 
  69.         m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; 
  70.         Shell_NotifyIcon(NIM_ADD, &m_tnd); 
  71.         m_bHidden = FALSE; 
  72.     } 
  73.   
  74. BOOL CSystemIcon::SetIcon(HICON hIcon) 
  75.     if (!m_bEnabled) return FALSE; 
  76.     m_tnd.uFlags = NIF_ICON; 
  77.     m_tnd.hIcon = hIcon; 
  78.     return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
  79.   
  80. BOOL CSystemIcon::SetIcon(LPCTSTR lpszIconName) 
  81.     HICON hIcon = AfxGetApp()->LoadIcon(lpszIconName); 
  82.     return SetIcon(hIcon); 
  83.   
  84. BOOL CSystemIcon::SetIcon(UINT nIDResource) 
  85.     HICON hIcon = AfxGetApp()->LoadIcon(nIDResource); 
  86.     return SetIcon(hIcon); 
  87.   
  88. BOOL CSystemIcon::SetStandardIcon(LPCTSTR lpIconName) 
  89.     HICON hIcon = LoadIcon(NULL, lpIconName); 
  90.     return SetIcon(hIcon); 
  91.   
  92. BOOL CSystemIcon::SetStandardIcon(UINT nIDResource) 
  93.     HICON hIcon = LoadIcon(NULL, MAKEINTRESOURCE(nIDResource)); 
  94.     return SetIcon(hIcon); 
  95.   
  96. HICON CSystemIcon::GetIcon() const 
  97.     HICON hIcon = NULL; 
  98.     if (m_bEnabled) 
  99.         hIcon = m_tnd.hIcon; 
  100.     return hIcon; 
  101.   
  102. BOOL CSystemIcon::SetTooltipText(LPCTSTR pszTip) 
  103.     if (!m_bEnabled) return FALSE; 
  104.   
  105.     m_tnd.uFlags = NIF_TIP; 
  106.     _tcscpy(m_tnd.szTip, pszTip); 
  107.     return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
  108.   
  109. BOOL CSystemIcon::SetTooltipText(UINT nID) 
  110.     CString strText; 
  111.     VERIFY(strText.LoadString(nID)); 
  112.     return SetTooltipText(strText); 
  113.   
  114. CString CSystemIcon::GetTooltipText() const 
  115.     CString strText; 
  116.     if (m_bEnabled) 
  117.         strText = m_tnd.szTip; 
  118.     return strText; 
  119.   
  120. BOOL CSystemIcon::SetNotificationWnd(CWnd* pWnd) 
  121.     if (!m_bEnabled) return FALSE; 
  122.     ASSERT(pWnd && ::IsWindow(pWnd->GetSafeHwnd())); 
  123.     m_tnd.hWnd = pWnd->GetSafeHwnd(); 
  124.     m_tnd.uFlags = 0; 
  125.     return Shell_NotifyIcon(NIM_MODIFY, &m_tnd); 
  126.   
  127. CWnd* CSystemIcon::GetNotificationWnd() const 
  128.     return CWnd::FromHandle(m_tnd.hWnd); 
  129.   
  130. LRESULT CSystemIcon::OnIconNotification(WPARAM wParam, LPARAM lParam) 
  131.     if (wParam != m_tnd.uID) 
  132.         return 0L; 
  133.     CMenu menu, *pSubMenu; 
  134.     //单击右键弹出菜单 
  135.     if (LOWORD(lParam) == WM_RBUTTONUP) 
  136.     {    
  137.         if (!menu.LoadMenu(m_tnd.uID)) return 0; 
  138.         if (!(pSubMenu = menu.GetSubMenu(0))) return 0; 
  139.         //设定第一项为缺省 
  140.         ::SetMenuDefaultItem(pSubMenu->m_hMenu, 0, TRUE); 
  141.         //定义弹出菜单 
  142.         CPoint pos; 
  143.         GetCursorPos(&pos); 
  144.         ::SetForegroundWindow(m_tnd.hWnd);  
  145.         ::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0, m_tnd.hWnd, NULL); 
  146.         ::PostMessage(m_tnd.hWnd, WM_NULL, 0, 0); 
  147.         menu.DestroyMenu(); 
  148.     } 
  149.     else if (LOWORD(lParam) == WM_LBUTTONDBLCLK) 
  150.     { 
  151.         if (!menu.LoadMenu(m_tnd.uID)) return 0; 
  152.         if (!(pSubMenu = menu.GetSubMenu(0))) return 0; 
  153.         //双击左键起动缺省菜单 
  154.         ::SetForegroundWindow(m_tnd.hWnd); 
  155.         ::SendMessage(m_tnd.hWnd, WM_COMMAND, pSubMenu->GetMenuItemID(0), 0); 
  156.         menu.DestroyMenu(); 
  157.     } 
  158.   
  159.     return 1;