|
楼主 |
发表于 2020-8-7 00:30:01
|
显示全部楼层
////////////////////////////////////////////////////////////////////////////////////////
// 预处理
#include "SysTray.h"
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 初始化
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;
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 创建托盘图标
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;
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 添加托盘消息响应
BOOL CSystemTray::EnableTrayMessage()
{
m_nid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
return Shell_NotifyIcon(NIM_MODIFY, &m_nid) ? true : false;
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 设置右键菜单
BOOL CSystemTray::SetMenu(UINT MenuID)
{
m_nid.uID = MenuID;
return Shell_NotifyIcon(NIM_MODIFY, &m_nid) ? true : false;
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 右键菜单消息响应
VOID CSystemTray::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
if(wParam != m_nid.uID)
return;
SetForegroundWindow(m_nid.hWnd);
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);
// 显示
TrackPopupMenu(hMenuTray, 0, //TPM_CENTERALIGN | TPM_RIGHTBUTTON,
MousePos.x, MousePos.y, 0, m_nid.hWnd, NULL);
// 销毁
DestroyMenu(hMenuTray);
DestroyMenu(hMenuMain);
break;}
case WM_LBUTTONDBLCLK:
if(m_DbClickMenuItem != 0)
SendMessage(m_nid.hWnd, WM_COMMAND, m_DbClickMenuItem, 0);
break;
case WM_LBUTTONUP:
if(m_LeftClickMenuItem != 0)
SendMessage(m_nid.hWnd, WM_COMMAND, m_LeftClickMenuItem, 0);
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 删除托盘图标
VOID CSystemTray::RemoveIcon()
{
Shell_NotifyIcon(NIM_DELETE, &m_nid);
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 设置托盘提示信息
BOOL CSystemTray::SetTooltipText(const TCHAR *pToolTips)
{
m_nid.uFlags = NIF_TIP;
lstrcpyn(m_nid.szTip, pToolTips, 128);
return Shell_NotifyIcon(NIM_MODIFY, &m_nid) ? true : false;
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 托盘气球提示
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);
return Shell_NotifyIcon(NIM_MODIFY, &m_nid) ? true : false;
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 设置托盘图标
BOOL CSystemTray::SetIcon(HICON hIcon)
{
m_nid.uFlags = NIF_ICON;
m_nid.hIcon = hIcon;
return Shell_NotifyIcon(NIM_MODIFY, &m_nid) ? true : false;
}
BOOL CSystemTray::SetIcon(UINT IconID)
{
HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IconID));
assert(hIcon != NULL);
return SetIcon(hIcon);
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 创建托盘动态图标列表
BOOL CSystemTray::CreateIconList(UINT FirstIconID, UINT LastIconID)
{
m_IconCount = LastIconID - FirstIconID + 1;
assert(m_IconCount > 1 && m_IconCount <= 20);
if(m_pIconList != NULL)
delete m_pIconList;
m_pIconList = new HICON[m_IconCount];
assert(m_pIconList != NULL);
HINSTANCE hInstance = GetModuleHandle(NULL);
for(UINT CurIconID = FirstIconID; CurIconID <= LastIconID; CurIconID++)
{
HICON hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(CurIconID));
assert(hIcon != NULL);
m_pIconList[CurIconID - FirstIconID] = hIcon;
}
return true;
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
// 托盘动态图标
static CSystemTray *pThis = NULL;
static VOID CALLBACK AnimateTimerProc(HWND hWnd, UINT Msg, UINT_PTR IdEvent, DWORD Time)
{
if(pThis == NULL)
return;
static INT Steps = 0;
pThis->SetIcon(pThis->m_pIconList[Steps]);
Steps++;
if(Steps >= pThis->m_IconCount)
Steps = 0;
}
BOOL CSystemTray::BeginAnimate(UINT DelayMilliSeconds)
{
assert(m_pIconList != NULL);
if(m_pIconList == NULL)
return false;
pThis = this;
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;
KillTimer(NULL, m_TimerId);
m_TimerId = 0;
}
////////////////////////////////////////////////////////////////////////////////////////
|
|