MFC 系统托盘图标实现(转载)

首先,必须知道一个结构体NOTIFYICONDATA ,这是MFC中包含系统需要的用来传递托盘区域消息的信息结构体,有了它,我们今
天的任务就完全可以轻松完成了!

这时候,我们可以在我们的类中申明一个NOTIFYICONDATA的成员变量为m_nid。

接下来,我们可以给这个结构体变量赋我们想要的值了,记住赋值语句要写在OnInitDialog初始化窗口函数里,不要写在构造函

数中,否则将会无效。
m_nid.cbSize = sizeof( NOTIFYICONDATA );
m_nid.hWnd = m_hWnd;
m_nid.uID = IDR_MAINFRAME;
m_nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
m_nid.uCallbackMessage = WM_SYSTEMTRAY; //自定义消息
m_nid.hIcon = m_hIcon;
strcpy(m_nid.szTip, "认证系统客户端");
::Shell_NotifyIcon(NIM_ADD, &m_nid);
然后,让我们一句句的解析这段代码,
m_nid.cbSize = sizeof( NOTIFYICONDATA );
cbSize表示结构体的大小,以字节未单位,这里赋值了NOTIFYICONDATA的结构体标准大小就行了,用sizeof函数就能获得其字节

大小
m_nid.hWnd = m_hWnd;
hWnd是你想要赋予托盘的窗口句柄,MFC的窗口类中因为都是继承CDialog类,所以其中会有一个成员变量是m_hWnd保存着当前实

例窗口的具体句柄,我们将其赋值给它就行了
m_nid.uID = IDR_MAINFRAME;
uID指的是应用程序定义的任务栏图标的标识符,简单的时候就是图片图标的ID,这里的ID你可以进入工程下的ResourceView中

找到Icon文件夹下的图标,里面的ID号就是我们现在要赋值的具体ID,Shell_NotifyIcon函数调用时,hWnd和UID成员用来标示

具体要操作的图标,可以通过多次的调用,来实现不同uID将多个图标关联到一个窗口hWnd上,从而实现托盘图标切换的效果
m_nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
uFlags表明具体哪些其他成员为合法数据,简单的说就是只有在uFlags中提到过的变量,才能发挥其作用,具体uFlags可以由以

下一些成员组合:
NIF_ICON 表示hicon成员起作用。
NIF_MESSAGE 表示uCallbackMessage成员起作用
NIF_TIP 表示szTip成员起作用
当然还有许多别的如:NIF_STATE,NIF_INFO,NIF_GUID,这里就具体先介绍上面三个,其他想了解的话可以具体查msdn
m_nid.uCallbackMessage = WM_SYSTEMTRAY;
uCallbackMessage是应用程序定义的消息标示,当鼠标在托盘鼠标上点击事件的时候,程序的WM_SYSTEMTRAY就会被发出,我们只

要在WindowProc函数中就能获得的该消息,从而做出事件响应,如下:
switch(message)
{
case WM_SYSTEMTRAY: //自定义消息
//具体响应消息
break;
}
其中,大家可以看出WM_SYSTEMTRAY不是系统消息,而是自定义的一个消息,用于表示这个特殊的事件发生了,至于怎么定义呢

,就是用宏了
#define WM_SYSTEMTRAY WM_USER+1
这里解释下,为什么WM_SYSTEMTRAY要宏定义成WM_USER+1呢,据我了解WM_USER是系统消息中的最后一个,也就是说这样定义就

不会和系统的消息冲突成一个同样的值
m_nid.hIcon = m_hIcon;
增加、修改或删除的图片句柄,用于控制托盘的图标,m_hIcon是自定义的一个窗口图标句柄
HICON m_hIcon;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
当然你可以直接将m_nid.hIcon = m_hIcon 改成 m_nid.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME)
strcpy(m_nid.szTip, "认证系统客户端");
szTip是一个字符串指针,是在鼠标放在图标上的时候,会出现的提示消息。
::Shell_NotifyIcon(NIM_ADD, &m_nid);
最后一个是一个全局函数 BOOL Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA ipdata);
参数dwMessage表示要执行的操作,可选值为:
NIM_ADD 表示在托盘区域增加图标
NIM_DELETE 表示删除托盘区域的图标
NIM_MODIFY 表示修改托盘区域的图标
NIM_SETFOCUS 表示聚焦到托盘图标上
第二个参数就是我们上面介绍过的NOTIFYICONDATA结构体的指针了。
如果操作成功函数会返回TRUE,否则返回FALSE。

///////////////////////////////////////////////////////////////////////////////////
OK,托盘的实现就是这么简单的啦,但是如果你想具体深入了解,可以查看MSDN里面具体的解释,也可以跟本人沟通
下面介绍下应用,具体的应用情况很多。
我们就来简单的讲一下,怎么实现窗口隐藏后,双击托盘使窗口再出现,和右击托盘出现退出窗口的实现
上面叫到了自定义的消息,在WindowProc函数中,我们可以具体实现
switch(message)
{
case WM_SYSTEMTRAY: //自定义消息
if (lParam == WM_LBUTTONDBLCLK)
{
ShowWindow(SW_SHOWNORMAL);
}
break;
}
上面的代码就实现了,双击托盘实现显示窗口的代码,非常简单,我们就不具体剖析了。
要实现右击托盘显示弹出窗口,我们必须先在资源中创建一个菜单,然后加入以下代码
case WM_SYSTEMTRAY: //自定义消息
if (lParam == WM_RBUTTONDOWN)
{
//右击弹出托盘菜单
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu *pPopUp=menu.GetSubMenu(0);
CPoint pt;
GetCursorPos(&pt);

SetForegroundWindow();
pPopUp->TrackPopupMenu(TPM_RIGHTBUTTON,pt.x,pt.y,this);
PostMessage(WM_NULL,0,0);
}
break;
代码中,刚开始定义了一个CMenu的对象,然后将我们之前创建的菜单ID加载进去,然后获得鼠标当前的位置,在这个位置上将

菜单显示出来

最后退出要删除图标: Shell_NotifyIcon(NIM_DELETE,&m_traydata);

时间: 2024-12-30 04:21:40

MFC 系统托盘图标实现(转载)的相关文章

修复VS2008 MFC类添加功能[转载+编辑]

VS2008 MFC类向导不能正确加载启动类向导给对话框添加类时出现网页错误提示:"行: 815错误: 对象不支持此属性或方法"勾选"使用 Internet Explorer 中的内置脚本调试程序"后再次出现页面错误提示:"行: 815char 3错误:对象不支持此属性或方法代码:0URL:file:///D:/Microsoft%20Visual%20Studio%209.0/VC/VCWizards/CodeWiz/MFC/Simple/HTML/20

JavaFx 添加系统托盘图标

//添加系统托盘图标. SystemTray tray = SystemTray.getSystemTray(); BufferedImage image = ImageIO.read(mainUi.class .getResourceAsStream("orange-ball.png")); trayIcon = new TrayIcon(image, "自动备份工具"); trayIcon.setToolTip("自动备份工具"); tray

系统托盘图标

系统托盘图标的创建主要使用 Shell_NotifyIcon 函数来实现,实现过程比较简单. 注意: 要创建系统托盘图标,必须要有窗口:要创建窗口,必须要有窗口过程函数. 一个窗口可以有多个系统托盘图标:图标彼此间用 hWnd 和 uID 区分: 窗口过程函数接收到事件后, wParam 表示 uID,lParam 表示 message: 以下是封装的托盘类代码: // notifyicon.h #ifndef _NOTIFYICON_H_ #define _NOTIFYICON_H_ #inc

将Mozilla ThunderBird最小化到系统托盘(转载)

转自:http://be-evil.org/mozilla-thunderbird-minize-to-tray.html Mozilla ThunderBird是一款非常不错的邮件客户端,但是其在默认状态下不能最小化到系统任务栏中,这个设计让我十分不爽,不过Mozilla那强悍的插 件资源完全弥补这个问题,下面介绍一款插件可以实现将Mozilla ThunderBird最小化到系统托盘: MinimizeToTray Plus Versions 1.0.8 这款插件可以将ThunderBird

自制一小型的linux系统mylinux(转载)

通过grub引导程序引导编译后的内核文件bzImage,把制作的文件系统变成ramdisk镜像文件,通过内存加载镜像文件完成文件系统的注入:其中的命令通过编译busybox生成bin,sbin文件:注意: 内核文件+文件系统镜像文件+grub引导程序<=1440K 详细步骤: 1.软盘上安装引导器(grub) 具体操作如下: # mke2fs /dev/fd0 创建了 ext2 文件 # mount /dev/fd0 /mnt/floppy 现在,创建一些目录,并将一些关键文件复制到软盘: #

Ubuntu 14.04系统托盘图标问题,skype托盘图标显示

Ubuntu?14.04系统托盘图标问题,skype托盘图标显示_瑞波支付_新浪博客 Ubuntu 14.04 取消了系统托盘白名单机制,导致使用传统系统托盘技术的程序无法显示出托盘图标,dconf-editor也无力解决这个问题 .Ubuntu Unity桌面目前使用的技术是indicator-application-service.那么如何继续让传统程序显示托盘图标呢?执行如下命令即可解决: ? sudo apt-get install libappindicator1 ? sudo apt

Ubuntu:如何显示系统托盘图标(systray)

1. 问题说明 Ubuntu 11版本开始,默认关闭了托盘图标的显示,需要手动执行命令或额外工具配置,添加到白名单.Ubuntu 13.04更彻底,默认配置根本没有托盘图标,除了java和wine等几个系统自带的程序可以显示,其它任何应用程序都不能显示,以前的命令也不支持了,例如QQ也显示不了了. Ubuntu 14.04 取消了系统托盘白名单机制,导致使用传统系统托盘技术的程序无法显示出托盘图标,dconf-editor也无力解决这个问题.Ubuntu Unity桌面目前使用的技术是indic

扛住100亿次请求——如何做一个“有把握”的春晚红包系统?(转载)

转载:原文链接 扛住100亿次请求——如何做一个“有把握”的春晚红包系统? 羊年春晚摇一摇活动已经落下帷幕,现在回过头来看看这一全民参与的有趣的活动背后,有着怎样的后台系统?这个系统又是如何被设计与实现出来的? 1.   春晚摇一摇活动形式 在了解这个系统之前,先看看羊年春晚有哪些活动形式?春晚摇一摇复用了摇一摇入口,但提供了全新的界面和交互内容. 在羊年春晚摇一摇界面里,用户摇动手机后,可以看到明星拜年.全家福.好友贺卡等精彩纷呈的活动页:也会有温馨的“休息一下”,或让很多误以为中奖的“挂服务

net获取系统当前时间 (转载)

net获取系统当前时间 (2011-06-17 13:26:10) 转载▼ 标签: it 分类: 我的实战 24小时制: DateTime dt = DateTime.Now; string dt24 = dt.ToString("yyyy-MM-dd HH:mm:ss"); 12小时制: DateTime dt = DateTime.Now; string dt12 = dt.ToString("yyyy-MM-dd hh:mm:ss"); H的大小写决定 如果是