00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "fsTrayIconMgr.h"
00008 #include <shellapi.h>
00009 #include <shlwapi.h>
00010
00011 #ifdef _DEBUG
00012 #undef THIS_FILE
00013 static char THIS_FILE[]=__FILE__;
00014 #define new DEBUG_NEW
00015 #endif
00016
00017 typedef HRESULT (CALLBACK *fntDllGetVersion) (DLLVERSIONINFO*);
00018
00019 DWORD GetShell32Version ()
00020 {
00021 static dwVer = 0;
00022
00023 if (dwVer == 0)
00024 {
00025 HMODULE hLib = LoadLibrary ("shell32.dll");
00026 if (hLib == NULL)
00027 return 0;
00028
00029 fntDllGetVersion pfn = (fntDllGetVersion) GetProcAddress (hLib, "DllGetVersion");
00030
00031 if (pfn == NULL)
00032 {
00033 FreeLibrary (hLib);
00034 return 0;
00035 }
00036
00037 DLLVERSIONINFO info;
00038 info.cbSize = sizeof (info);
00039 pfn (&info);
00040
00041 FreeLibrary (hLib);
00042
00043 return dwVer = info.dwMajorVersion;
00044 }
00045
00046 return dwVer;
00047 }
00048
00049 fsTrayIconMgr::fsTrayIconMgr()
00050 {
00051 m_pIcons = NULL;
00052 m_iCurIconIndex = 0;
00053
00054 m_cbNIDSize = GetShell32Version () >= 5 ? sizeof (NOTIFYICONDATA) : NOTIFYICONDATA_V1_SIZE;
00055 }
00056
00057 fsTrayIconMgr::~fsTrayIconMgr()
00058 {
00059
00060 }
00061
00062 BOOL fsTrayIconMgr::Create(HWND hWnd, UINT *pIcons, UINT cIcons, LPCSTR pszTooltip, UINT uCallbackMsg)
00063 {
00064 LoadIcons (pIcons, cIcons);
00065 m_hWnd = hWnd;
00066 m_uCallbackMsg = uCallbackMsg;
00067 m_strTip = pszTooltip;
00068
00069 return InitializeTrayIcon ();
00070 }
00071
00072 void fsTrayIconMgr::LoadIcons(UINT *pIcons, UINT cIcons)
00073 {
00074 if (m_pIcons)
00075 delete [] m_pIcons;
00076
00077 m_pIcons = new HICON [cIcons];
00078 m_cIcons = cIcons;
00079
00080 for (UINT i = 0; i < cIcons; i++)
00081 m_pIcons [i] = LoadIcon (AfxGetResourceHandle (), MAKEINTRESOURCE (pIcons [i]));
00082 }
00083
00084 void fsTrayIconMgr::Remove()
00085 {
00086 NOTIFYICONDATA data;
00087
00088 data.cbSize = m_cbNIDSize;
00089 data.hWnd = m_hWnd;
00090 data.uID = m_nID;
00091
00092 Shell_NotifyIcon (NIM_DELETE, &data);
00093 }
00094
00095 BOOL fsTrayIconMgr::ShowIcon(int iIndex)
00096 {
00097 NOTIFYICONDATA data;
00098
00099 if (m_pIcons == NULL)
00100 return FALSE;
00101
00102 data.cbSize = m_cbNIDSize;
00103 data.hIcon = m_pIcons [m_iCurIconIndex = iIndex];
00104 data.hWnd = m_hWnd;
00105 data.uFlags = NIF_ICON;
00106 data.uID = m_nID;
00107
00108 return Shell_NotifyIcon (NIM_MODIFY, &data);
00109 }
00110
00111 BOOL fsTrayIconMgr::InitializeTrayIcon()
00112 {
00113 NOTIFYICONDATA data;
00114
00115 data.cbSize = m_cbNIDSize;
00116 data.hIcon = m_pIcons [0];
00117 data.hWnd = m_hWnd;
00118 strcpy (data.szTip, m_strTip);
00119 data.uCallbackMessage = m_uCallbackMsg;
00120 data.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
00121 data.uID = m_nID = 0;
00122
00123 return Shell_NotifyIcon (NIM_ADD, &data);
00124 }
00125
00126 void fsTrayIconMgr::TestIcon()
00127 {
00128 if (FALSE == ShowIcon (m_iCurIconIndex))
00129 {
00130 InitializeTrayIcon ();
00131 ShowIcon (m_iCurIconIndex);
00132 }
00133 }
00134
00135 BOOL fsTrayIconMgr::ShowBalloon(LPCSTR pszInfo, LPCSTR pszInfoTitle, DWORD dwNiifIcon)
00136 {
00137 if (GetShell32Version () < 5)
00138 return FALSE;
00139
00140 NOTIFYICONDATA data;
00141
00142 data.cbSize = m_cbNIDSize;
00143 data.hWnd = m_hWnd;
00144 data.uID = m_nID;
00145 data.uFlags = NIF_INFO;
00146
00147 if (strlen (pszInfo) > 255)
00148 {
00149 strncpy (data.szInfo, pszInfo, 255);
00150 data.szInfo [255] = 0;
00151 }
00152 else
00153 strcpy (data.szInfo, pszInfo);
00154
00155 if (strlen (pszInfoTitle) > 63)
00156 {
00157 strncpy (data.szInfoTitle, pszInfoTitle, 63);
00158 data.szInfoTitle [63] = 0;
00159 }
00160 else
00161 strcpy (data.szInfoTitle, pszInfoTitle);
00162
00163 data.dwInfoFlags = dwNiifIcon;
00164 data.uTimeout = UINT_MAX;
00165
00166 return Shell_NotifyIcon (NIM_MODIFY, &data);
00167 }