托盘CTrayNotify类
NIM_DELETE 删除任务栏通知区的图标;
NIM_MODIFY 更改任务栏通知区的图标、回调消息标志、回调窗口句柄或提示字串;
回调信息的获得及处理
通过这种方式,系统通知应用程序用户对图标的操作。如果一个应用程序生成了两个以上的图标,那么你可以根据wParam来判断是哪个图标返回的鼠标操作。通常,标准的Win95任务栏图标有以下鼠标操作响应:
当鼠标停留在图标上时,系统应显示提示信息tooltip;
当使用鼠标右键单击图标时,应用程序应显示快捷菜单;
当使用鼠标左键双击图标时,应用程序应执行快捷菜单的缺省菜单项。
在Microsoft Windows环境中,0x8000到0xBFFF的消息是保留的,应用程序可以定义自定义消息
头文件
#ifndef _TRAYNOTIFY_H_
#define _TRAYNOTIFY_H_
class CTrayNotify
{
public:
CTrayNotify();
virtual ~CTrayNotify();
//设置和得到图标
void SetIcon(const HICON hIcon,BOOL bEnable=TRUE);
HICON GetIcon() const;
//设置和得到消息
void SetMsg(UINT uMsg,BOOL bEnable=TRUE);
UINT GetMsg();
//设置和得到提示
void SetTip(const char *szTip,BOOL bEnable=TRUE);
void GetTip(char* szTip,UINT uTxtLen) const;
//设置和得到关联的窗口句柄
BOOL SetHwnd(const HWND hWnd);
HWND GetHwnd() const;
//设置和得到ID号
void SetID(const UINT uID);
UINT GetID() const;
//设置和得到uFlags
void SetFlag(UINT uFlag);
UINT GetFlag() const;
//当用调用过SetIcon之类的函数后,不会立即更新,而必须调用此函数更新
BOOL Refresh();
//控制图标是否可见
BOOL ShowIcon(BOOL bShow);
//修改并更新
BOOL Modify(const NOTIFYICONDATA& nid);
//得到NOTIFYICONDATA数据结构
void GetNid(NOTIFYICONDATA* pNid) const;
//图标是否可见
BOOL IsIconShow() const;
//去掉图标,并将NOTIFYICONDATA结构清零
void Reset();
protected:
BOOL m_bShow;
NOTIFYICONDATA m_nid;
private:
};
#endif
实现代码
#include <Windows.h>
#include "TrayNotify.h"
//由于该类实现比较简单,很多东西在MSDN中一查便知,所以也就不在此多加注释
/*---------------------------------------------------------------------------------
*/
CTrayNotify::CTrayNotify()
{
memset((void*)&m_nid,0,sizeof(m_nid));
m_nid.cbSize=sizeof(m_nid);
m_bShow=FALSE;
}
/*---------------------------------------------------------------------------------
*/
CTrayNotify::~CTrayNotify()
{
ShowIcon(FALSE);
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::SetIcon(const HICON hIcon,BOOL bEnable)
{
m_nid.hIcon=hIcon;
if(bEnable)
m_nid.uFlags|=NIF_ICON;
}
/*---------------------------------------------------------------------------------
*/
HICON CTrayNotify::GetIcon() const
{
return m_nid.hIcon;
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::SetMsg(UINT uMsg,BOOL bEnable)
{
m_nid.uCallbackMessage=uMsg;
if(bEnable)
m_nid.uFlags|=NIF_MESSAGE;
}
/*---------------------------------------------------------------------------------
*/
UINT CTrayNotify::GetMsg()
{
return m_nid.uCallbackMessage;
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::SetTip(const char *szTip,BOOL bEnable)
{
lstrcpyn(m_nid.szTip,szTip,sizeof(m_nid.szTip));
if(bEnable)
m_nid.uFlags|=NIF_TIP;
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::GetTip(char *szTip,UINT uTxtLen) const
{
lstrcpyn(szTip,m_nid.szTip,uTxtLen);
}
/*---------------------------------------------------------------------------------
*/
BOOL CTrayNotify::SetHwnd(const HWND hWnd)
{
BOOL bRet=TRUE;
if(IsWindow(hWnd))
{
m_nid.hWnd=hWnd;
}
else
bRet=FALSE;
return bRet;
}
/*---------------------------------------------------------------------------------
*/
HWND CTrayNotify::GetHwnd() const
{
return m_nid.hWnd;
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::SetID(const UINT uID)
{
m_nid.uID=uID;
}
/*---------------------------------------------------------------------------------
*/
UINT CTrayNotify::GetID() const
{
return m_nid.uID;
}
/*---------------------------------------------------------------------------------
*/
BOOL CTrayNotify::Refresh()
{
return Shell_NotifyIcon(NIM_MODIFY,&m_nid);
}
/*---------------------------------------------------------------------------------
*/
BOOL CTrayNotify::ShowIcon(BOOL bShow)
{
BOOL bRet=FALSE;
if(m_bShow)
{
if(!bShow)
{
bRet=Shell_NotifyIcon(NIM_DELETE,&m_nid);
}
}
else
{
if(bShow)
bRet=Shell_NotifyIcon(NIM_ADD,&m_nid);
}
if(bRet)
{
m_bShow=bShow;
}
return bRet;
}
/*---------------------------------------------------------------------------------
*/
BOOL CTrayNotify::Modify(const NOTIFYICONDATA& nid)
{
CopyMemory((void*)&m_nid,(void*)&nid,sizeof(nid));
return Shell_NotifyIcon(NIM_MODIFY,&m_nid);
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::GetNid(NOTIFYICONDATA* pNid) const
{
CopyMemory((void*)pNid,(void*)&m_nid,sizeof(m_nid));
}
/*---------------------------------------------------------------------------------
*/
BOOL CTrayNotify::IsIconShow() const
{
return m_bShow;
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::Reset()
{
ShowIcon(FALSE);
memset((void*)&m_nid,0,sizeof(m_nid));
}
/*---------------------------------------------------------------------------------
*/
void CTrayNotify::SetFlag(UINT uFlag)
{
m_nid.uFlags=uFlag;
}
/*---------------------------------------------------------------------------------
*/
UINT CTrayNotify::GetFlag() const
{
return m_nid.uFlags;
}
//文件尾
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!