📄 bbsystemtray.cpp
字号:
// BBSystemTray.cpp: implementation of the CBBSystemTray class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "BBSystemTray.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_DYNAMIC(CBBSystemTray, CWnd)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBBSystemTray::CBBSystemTray()
{
Init();
}
BOOL CBBSystemTray::Create(CWnd* pParent, UINT uCallbackMessage, LPCTSTR szToolTipText, HICON hIcon, UINT uMenuID)
{
// 自定义消息是否大于WM_USER
ASSERT(uCallbackMessage >= WM_USER);
//检查提示字符是否大于64个字符,因为提示信息不允许大于64字符
ASSERT(_tcslen(szToolTipText) <= 64);
CWnd::CreateEx(0, AfxRegisterWndClass(0),
_T(""), WS_POPUP, 0,0,10,10, NULL, 0);
m_tnd.cbSize = sizeof(NOTIFYICONDATA);
m_tnd.hWnd = pParent->GetSafeHwnd()? pParent->GetSafeHwnd() : m_hWnd;
m_tnd.uID = uMenuID;
m_tnd.hIcon = hIcon;
m_tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
m_tnd.uCallbackMessage = uCallbackMessage;
_tcscpy(m_tnd.szTip, szToolTipText);
//设置图标
VERIFY(m_bAdded =Shell_NotifyIcon(NIM_ADD, &m_tnd));
return m_bAdded;
}
BOOL CBBSystemTray::Create(LPCTSTR szToolTipText, HICON hIcon, UINT uMenuID)
{
return Create(NULL,WM_DEFAULT_NOTIFY_MESSAGE,szToolTipText,hIcon,uMenuID);
}
//初始化
BOOL CBBSystemTray::Init()
{
m_bAdded=FALSE;
memset(&m_tnd, 0, sizeof(m_tnd));
m_nDefaultMenuItemID = 0;
m_bDefaultMenuItemByPos = TRUE;
return TRUE;
}
CBBSystemTray::~CBBSystemTray()
{
//删除图标
RemoveIcon();
}
void CBBSystemTray::RemoveIcon()
{
ASSERT(m_bAdded);
if (!m_bAdded)
return;
m_tnd.uFlags = 0;
Shell_NotifyIcon(NIM_DELETE, &m_tnd);
}
//改变图标
BOOL CBBSystemTray::SetIcon(HICON hIcon)
{
ASSERT(m_bAdded);
if (!m_bAdded)
return FALSE;
m_tnd.uFlags = NIF_ICON;
m_tnd.hIcon = hIcon;
return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
}
BOOL CBBSystemTray::SetIcon(UINT nIDResource)
{
HICON hIcon = AfxGetApp()->LoadIcon(nIDResource);
return SetIcon(hIcon);
}
HICON CBBSystemTray::GetIcon() const
{
return m_bAdded?m_tnd.hIcon:NULL;
}
//修改提示
BOOL CBBSystemTray::SetTooltipText(LPCTSTR pszTip)
{
m_tnd.uFlags = NIF_TIP;
_tcscpy(m_tnd.szTip, pszTip);
return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
}
//得到当前提示
CString CBBSystemTray::GetTooltipText() const
{
ASSERT(m_bAdded);
if(m_bAdded)
{
CString strText;
strText = m_tnd.szTip;
return strText;
}
else
{
return "";
}
}
//设置消息的处理Notify窗口
BOOL CBBSystemTray::SetNotificationWnd(CWnd* pWnd)
{
ASSERT(m_bAdded);
if(!m_bAdded)
return FALSE;
ASSERT(pWnd && ::IsWindow(pWnd->GetSafeHwnd()));
m_tnd.hWnd = pWnd->GetSafeHwnd();
m_tnd.uFlags = 0;
return Shell_NotifyIcon(NIM_MODIFY, &m_tnd);
}
CWnd* CBBSystemTray::GetNotificationWnd() const
{
return CWnd::FromHandle(m_tnd.hWnd);
}
//设置默认的菜单项(双击图标打开),bByPos为TRUE表示从位置上的序号,否则以菜单ID为第一参数
BOOL CBBSystemTray::SetMenuDefaultItem(UINT uItem, BOOL bByPos)
{
if ((m_nDefaultMenuItemID == uItem) && (m_bDefaultMenuItemByPos == bByPos))
return TRUE;
m_nDefaultMenuItemID = uItem;
m_bDefaultMenuItemByPos = bByPos;
CMenu menu, *pSubMenu;
if (!menu.LoadMenu(m_tnd.uID)) return FALSE;
if (!(pSubMenu = menu.GetSubMenu(0))) return FALSE;
::SetMenuDefaultItem(pSubMenu->m_hMenu, m_nDefaultMenuItemID, m_bDefaultMenuItemByPos);
return TRUE;
}
void CBBSystemTray::GetMenuDefaultItem(UINT& uItem, BOOL& bByPos)
{
uItem = m_nDefaultMenuItemID;
bByPos = m_bDefaultMenuItemByPos;
}
/////////////////////////////////////////////////////////////////////////////
// CBBSystemTray message handlers
BEGIN_MESSAGE_MAP(CBBSystemTray, CWnd)
//{{AFX_MSG_MAP(CBBSystemTray)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//该函数是默认的消息处理函数,如有需要改变默认的操作,可以重载该函数
LRESULT CBBSystemTray::OnTrayNotification(WPARAM wParam, LPARAM lParam)
{
//检查ID是否一样,是否本实例
if (wParam != m_tnd.uID)
return 0L;
CMenu menu, *pSubMenu;
CWnd* pTarget = AfxGetMainWnd();
//处理右键,显示菜单
if (LOWORD(lParam) == WM_RBUTTONUP)
{
if (!menu.LoadMenu(m_tnd.uID)) return 0;
if (!(pSubMenu = menu.GetSubMenu(0))) return 0;
//设置默认的菜单项(加粗)
::SetMenuDefaultItem(pSubMenu->m_hMenu, m_nDefaultMenuItemID, m_bDefaultMenuItemByPos);
//显示菜单
CPoint pos;
GetCursorPos(&pos);
//窗口置前,使其活动
pTarget->SetForegroundWindow();
::TrackPopupMenu(pSubMenu->m_hMenu, 0, pos.x, pos.y, 0,
pTarget->GetSafeHwnd(), NULL);
//不知怎么样,需要调用下面的函数,就没有问题
pTarget->PostMessage(WM_NULL, 0, 0);
menu.DestroyMenu();
}
else if (LOWORD(lParam) == WM_LBUTTONDBLCLK)
{
//处理双击--执行默认的菜单操作
pTarget->SetForegroundWindow();
UINT uItem;
//获得默认菜单
if (m_bDefaultMenuItemByPos)
{
if (!menu.LoadMenu(m_tnd.uID)) return 0;
if (!(pSubMenu = menu.GetSubMenu(0))) return 0;
uItem = pSubMenu->GetMenuItemID(m_nDefaultMenuItemID);
}
else
uItem = m_nDefaultMenuItemID;
//处理菜单的消息
pTarget->SendMessage(WM_COMMAND, uItem, 0);
menu.DestroyMenu();
}
return 1;
}
LRESULT CBBSystemTray::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
//处理消息Notify操作
if (message == m_tnd.uCallbackMessage)
return OnTrayNotification(wParam, lParam);
return CWnd::WindowProc(message, wParam, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -