zoukankan      html  css  js  c++  java
  • TrayIcon

    一直以为右下角气泡提醒是自己做的一个对话框.....才知道是TRAYICON的东东.

    找到一篇好文章

    http://www.codeproject.com/Articles/3147/WTL-Tray-Icon-Template

    在此基础上少加改动,把气泡添上了..呵呵.

      1 #pragma once
      2 
      3 template <typename T>
      4 class ATL_NO_VTABLE CTrayIconImpl
      5 {
      6     UINT WM_TRAYICON;
      7     NOTIFYICONDATA m_nid;
      8     bool m_bInstalled;
      9 public:
     10     CTrayIconImpl() : m_bInstalled( false )
     11     {
     12         memset( &m_nid, 0, sizeof( NOTIFYICONDATA ) );
     13         m_nid.cbSize = sizeof( NOTIFYICONDATA );
     14 
     15         WM_TRAYICON = ::RegisterWindowMessage( TEXT( "WM_TRAYICON" ) );
     16     }
     17 
     18     ~CTrayIconImpl()
     19     {
     20         if ( m_bInstalled )
     21         {
     22             m_nid.uFlags = 0;
     23             Shell_NotifyIcon( NIM_DELETE, &m_nid );
     24         }
     25     }
     26 
     27     bool InstallTrayIcon( HICON hIcon, LPCTSTR lpszTip = NULL, UINT uID = -1 )
     28     {
     29         T* pT = static_cast<T*>( this );
     30 
     31         if ( m_bInstalled )
     32         {
     33             return false;
     34         }
     35 
     36         m_nid.hWnd = pT->m_hWnd;
     37         m_nid.uID = uID;
     38         m_nid.hIcon = hIcon;
     39         m_nid.uCallbackMessage = WM_TRAYICON;
     40 
     41         if ( lpszTip != NULL )
     42         {
     43             m_nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
     44             lstrcpy( m_nid.szTip, lpszTip );
     45         }
     46         else
     47         {
     48             m_nid.uFlags = NIF_MESSAGE | NIF_ICON;
     49         }
     50 
     51         m_bInstalled = Shell_NotifyIcon( NIM_ADD, &m_nid ) ? true : false;
     52 
     53         return m_bInstalled;
     54     }
     55 
     56 
     57     bool RemoveTrayIcon()
     58     {
     59         if ( m_bInstalled )
     60         {
     61             m_nid.uFlags = 0;
     62 
     63             if ( Shell_NotifyIcon( NIM_DELETE, &m_nid ) )
     64             {
     65                 m_bInstalled = false;
     66                 return true;
     67             }
     68         }
     69 
     70         return false;
     71     }
     72 
     73     bool SetTrayTip( LPCTSTR lpszTip )
     74     {
     75         if ( lpszTip != NULL )
     76         {
     77             m_nid.uFlags = NIF_TIP;
     78             lstrcpy( m_nid.szTip, lpszTip );
     79             return Shell_NotifyIcon( NIM_MODIFY, &m_nid ) ? true : false;
     80         }
     81 
     82         return false;
     83     }
     84 
     85     bool SetTrayInfo( LPCTSTR lpszInfo, LPCTSTR lpszTitle, UINT uTimeout = 3000, DWORD dwInfoFlags = NIIF_INFO )
     86     {
     87         if ( lpszInfo != NULL )
     88         {
     89             m_nid.uFlags = NIF_INFO;
     90             m_nid.uTimeout = uTimeout;
     91             m_nid.dwInfoFlags = dwInfoFlags;
     92             lstrcpy( m_nid.szInfo, lpszInfo );
     93             lstrcpy( m_nid.szInfoTitle, lpszTitle ? lpszTitle : TEXT( "" ) );
     94             return Shell_NotifyIcon( NIM_MODIFY, &m_nid ) ? true : false;
     95         }
     96 
     97         return false;
     98     }
     99 
    100     BEGIN_MSG_MAP( CTrayIconImpl<T> )
    101         MESSAGE_HANDLER( WM_TRAYICON, OnTrayIcon )
    102         MESSAGE_HANDLER( WM_SYSCOMMAND, OnSysCommand )
    103     END_MSG_MAP()
    104 
    105     void PrepareTrayMenu( HMENU hMenu )
    106     {
    107         ATLASSERT( FALSE );
    108 
    109         /*
    110         CMenuHandle menu(hMenu);
    111         menu.EnableMenuItem(ID_TEST_DISABLED, MF_GRAYED);
    112         menu.CheckMenuItem(ID_TEST_CHECKED, MF_CHECKED);
    113         */
    114     }
    115 
    116     LRESULT OnTrayIcon( UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/ )
    117     {
    118         POINT pt;
    119         HMENU hMenu, hPopup;
    120 
    121         T* pT = static_cast<T*>( this );
    122 
    123         if ( wParam != m_nid.uID )
    124         {
    125             return 0;
    126         }
    127 
    128         switch ( LOWORD( lParam ) )
    129         {
    130             case WM_RBUTTONUP:
    131                 ::GetCursorPos( &pt );
    132 
    133                 hMenu = ::LoadMenu( ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE( m_nid.uID ) );
    134 
    135                 if ( !hMenu )return 0;
    136 
    137                 hPopup = ::GetSubMenu( hMenu, 0 );
    138                 pT->PrepareTrayMenu( hPopup );
    139 
    140                 ::SetForegroundWindow( pT->m_hWnd );
    141                 ::TrackPopupMenu( hPopup, TPM_RIGHTALIGN, pt.x, pt.y, 0, pT->m_hWnd, NULL );
    142                 // BUGFIX: See "PRB: Menus for Notification Icons Do Not Work Correctly"
    143                 pT->PostMessage( WM_NULL );
    144 
    145                 ::DestroyMenu( hMenu );
    146                 break;
    147 
    148             case WM_LBUTTONDBLCLK:
    149                 if ( pT->IsIconic() )
    150                 {
    151                     pT->ShowWindow( SW_RESTORE );
    152                 }
    153                 else
    154                 {
    155                     if ( !pT->IsWindowVisible() )
    156                     {
    157                         pT->ShowWindow( SW_SHOW );
    158                         ::BringWindowToTop( pT->m_hWnd );
    159                         ::SetForegroundWindow( pT->m_hWnd );
    160                     }
    161                     else
    162                     {
    163                         pT->ShowWindow( SW_HIDE );
    164                     }
    165                 }
    166 
    167                 break;
    168 
    169             case NIN_BALLOONUSERCLICK:
    170                 if ( pT->IsIconic() )
    171                 {
    172                     pT->ShowWindow( SW_RESTORE );
    173                 }
    174                 else
    175                 {
    176                     if ( !pT->IsWindowVisible() )
    177                     {
    178                         pT->ShowWindow( SW_SHOW );
    179                         ::BringWindowToTop( pT->m_hWnd );
    180                     }
    181 
    182                     ::SetForegroundWindow( pT->m_hWnd );
    183                 }
    184 
    185                 break;
    186         }
    187 
    188         return 0;
    189     }
    190 
    191     LRESULT OnSysCommand( UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled )
    192     {
    193         T* pT = static_cast<T*>( this );
    194 
    195         if ( wParam == SC_MINIMIZE )
    196         {
    197             pT->ShowWindow( SW_HIDE );
    198             bHandled = TRUE;
    199         }
    200         else
    201         {
    202             bHandled = FALSE;
    203         }
    204 
    205         return 0;
    206     }
    207 };
  • 相关阅读:
    11_listview入门
    10_上午回顾&数据库事务
    09_sqlite两种api比较
    08_通过谷歌封装的api操作数据库update&query
    微软宣布下一代集成开发环境 — Visual Studio 2019
    微软宣布下一代集成开发环境 — Visual Studio 2019
    Chrome 调试技巧
    Chrome 调试技巧
    Chrome 调试技巧
    程序员最喜欢说的十句话,看看你最喜欢说哪句?
  • 原文地址:https://www.cnblogs.com/javado/p/2677044.html
Copyright © 2011-2022 走看看