|
///////////////////////////////////////////////// /////////////////////////////////////
// preprocessing
#include "SysTray.h"
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// Initialize
CSystemTray::CSystemTray()
{
m_DbClickMenuItem = 0;
m_LeftClickMenuItem = 0;
m_IconCount = 0;
m_TimerId = 0;
m_pIconList = NULL;
}
CSystemTray::~CSystemTray()
{
if(m_pIconList != NULL)
delete m_pIconList;
}
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// Create tray icon
BOOL CSystemTray::Create(HWND hWndParent, UINT CallbackMessage, const TCHAR *pToolTip,
HICON hIcon, UINT MenuID)
{
assert(CallbackMessage >= WM_USER);
assert(lstrlen(pToolTip) <128);
m_nid.cbSize = sizeof(m_nid);
m_nid.uCallbackMessage = CallbackMessage;
m_nid.uFlags = NIF_ICON | NIF_TIP;
m_nid.hIcon = hIcon;
m_nid.hWnd = hWndParent;
m_nid.uID = MenuID;
lstrcpyn(m_nid.szTip, pToolTip, 128);
return Shell_NotifyIcon(NIM_ADD,&m_nid)? true: false;
}
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// Add tray message response
BOOL CSystemTray::EnableTrayMessage()
{
m_nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
return Shell_NotifyIcon(NIM_MODIFY,&m_nid)? true: false;
}
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// Set the right-click menu
BOOL CSystemTray::SetMenu(UINT MenuID)
{
m_nid.uID = MenuID;
To
return Shell_NotifyIcon(NIM_MODIFY,&m_nid)? true: false;
}
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// Right-click menu message response
VOID CSystemTray::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
if(wParam != m_nid.uID)
return;
To
SetForegroundWindow(m_nid.hWnd);
To
switch(LOWORD(lParam))
{
case WM_RBUTTONUP:{
HMENU hMenuMain = LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(m_nid.uID));
if(hMenuMain == NULL)
return;
HMENU hMenuTray = GetSubMenu(hMenuMain, 0);
if(hMenuTray == NULL)
return;
POINT MousePos;
GetCursorPos(&MousePos);
// show
TrackPopupMenu(hMenuTray, 0, //TPM_CENTERALIGN | TPM_RIGHTBUTTON,
MousePos.x, MousePos.y, 0, m_nid.hWnd, NULL);
// destroy
DestroyMenu(hMenuTray);
DestroyMenu(hMenuMain);
break;}
To
case WM_LBUTTONDBLCLK:
if(m_DbClickMenuItem != 0)
SendMessage(m_nid.hWnd, WM_COMMAND, m_DbClickMenuItem, 0);
break;
To
case WM_LBUTTONUP:
if(m_LeftClickMenuItem != 0)
SendMessage(m_nid.hWnd, WM_COMMAND, m_LeftClickMenuItem, 0);
break;
}
}
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// delete tray icon
VOID CSystemTray::RemoveIcon()
{
Shell_NotifyIcon(NIM_DELETE,&m_nid);
}
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// Set tray prompt information
BOOL CSystemTray::SetTooltipText(const TCHAR *pToolTips)
{
m_nid.uFlags = NIF_TIP;
lstrcpyn(m_nid.szTip, pToolTips, 128);
To
return Shell_NotifyIcon(NIM_MODIFY,&m_nid)? true: false;
}
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// Tray balloon prompt
BOOL CSystemTray::ShowBalloonTip(LPCTSTR lpszTitle, LPCTSTR lpszMsg, DWORD dwInfoFlags, UINT nTimeout/*=3000*/)
{
if(!(m_nid.uFlags&NIF_INFO))
m_nid.uFlags |= NIF_INFO;
m_nid.uTimeout = nTimeout;
m_nid.dwInfoFlags = dwInfoFlags;
lstrcpy(m_nid.szInfoTitle, lpszTitle);
lstrcpy(m_nid.szInfo, lpszMsg);
To
return Shell_NotifyIcon(NIM_MODIFY,&m_nid)? true: false;
}
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// Set tray icon
BOOL CSystemTray::SetIcon(HICON hIcon)
{
m_nid.uFlags = NIF_ICON;
m_nid.hIcon = hIcon;
To
return Shell_NotifyIcon(NIM_MODIFY,&m_nid)? true: false;
}
BOOL CSystemTray::SetIcon(UINT IconID)
{
HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IconID));
assert(hIcon != NULL);
To
return SetIcon(hIcon);
}
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// Create a list of tray dynamic icons
BOOL CSystemTray::CreateIconList(UINT FirstIconID, UINT LastIconID)
{
m_IconCount = LastIconID-FirstIconID + 1;
assert(m_IconCount> 1&&m_IconCount <= 20);
To
if(m_pIconList != NULL)
delete m_pIconList;
To
m_pIconList = new HICON[m_IconCount];
assert(m_pIconList != NULL);
To
HINSTANCE hInstance = GetModuleHandle(NULL);
for(UINT CurIconID = FirstIconID; CurIconID <= LastIconID; CurIconID++)
{
HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(CurIconID));
assert(hIcon != NULL);
To
m_pIconList[CurIconID-FirstIconID] = hIcon;
}
To
return true;
}
///////////////////////////////////////////////// /////////////////////////////////////
///////////////////////////////////////////////// /////////////////////////////////////
// Tray dynamic icon
static CSystemTray *pThis = NULL;
static VOID CALLBACK AnimateTimerProc(HWND hWnd, UINT Msg, UINT_PTR IdEvent, DWORD Time)
{
if(pThis == NULL)
return;
To
static INT Steps = 0;
pThis->SetIcon(pThis->m_pIconList[Steps]);
To
Steps++;
if(Steps >= pThis->m_IconCount)
Steps = 0;
}
BOOL CSystemTray::BeginAnimate(UINT DelayMilliSeconds)
{
assert(m_pIconList != NULL);
if(m_pIconList == NULL)
return false;
To
pThis = this;
To
m_TimerId = (UINT)SetTimer(NULL, 0, DelayMilliSeconds, (TIMERPROC)AnimateTimerProc);
return m_TimerId != 0;
}
VOID CSystemTray::StopAnimate()
{
assert(m_TimerId != 0);
if(m_TimerId == 0)
return;
To
KillTimer(NULL, m_TimerId);
m_TimerId = 0;
}
///////////////////////////////////////////////// ///////////////////////////////////// |
|