MFC为应用程序添加托盘(右键托盘,弹出菜单)
源代码:http://download.csdn.net/detail/nuptboyzhb/4137784
1. 导入一个托盘图标的资源(.ico)格式;资源ID为IDI_ICON1
2. 在框架程序的初始化函数中,初始化一个托盘图标的一个结构体
NOTIFYICONDATA notifyicondata;//NOTIFYICONDATA结构
notifyicondata.cbSize = sizeof(NOTIFYICONDATA);//为notifyicondata结构体分配空间
//为notifyicondata结构体各个参数赋值
notifyicondata.hWnd = m_hWnd;//窗口的句柄
notifyicondata.uID = IDI_NOTIFYICON; //ID标识
notifyicondata.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
notifyicondata.uCallbackMessage = WM_ADDTRAYICON;//回调消息的标识;我们要为回调消息的标识添加用户消息映射
notifyicondata.hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);//加载托盘图标
wcscpy(notifyicondata.szTip, _T("为程序创建托盘图标"));
Shell_NotifyIcon(NIM_ADD, ¬ifyicondata); //装载托盘图标
注意:在该步骤中有几个注意的变量:
a. m_hWnd是整个应用程序窗口的句柄
b. IDI_NOTIFYICON是我们自己定义的一个常量;即在头文件上添加如下代码:
#define IDI_NOTIFYICON 100 //托盘图标标识
c. WM_ADDTRAYICON是我们自定义消息的标识,也是一个常量;
#define WM_ADDTRAYICON WM_USER+101//自定义消息
3. 添加用户消息映射和消息处理函数
1. 添加成员函数:
afx_msg LRESULT OnAddTrayIcon(WPARAM wParam,LPARAM lParam);
2. 添加消息映射
ON_MESSAGE(WM_ADDTRAYICON, OnAddTrayIcon)//添加消息映射
注意:第一个参数是用户自定义消息的标识;第二个参数是消息响应处理函数
3. 实现消息响应处理函数OnAddTrayIcon
LRESULT 类名::OnAddTrayIcon(WPARAM wParam,LPARAM lParam)
{
if (wParam == IDI_NOTIFYICON)//为创建的托盘图标
{
switch(lParam)//消息的类型
{
case WM_LBUTTONDBLCLK://双击左键
//实习窗口的隐藏或显示
//AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);//隐藏窗口
break;
case WM_RBUTTONDBLCLK://双击右键
{
AfxGetApp()->m_pMainWnd->DestroyWindow();//关闭窗口
break;
}
case WM_RBUTTONDOWN://右击托盘,显示菜单
{
CMenu menu,*pSubMenu; //后面要用的CMenu对象
CPoint point;
menu.LoadMenu(IDR_POPUP_MENU); //装载自定义的右键菜单
pSubMenu = menu.GetSubMenu(0); //获取第一个弹出菜单
GetCursorPos(&point); //获取当前光标位置 pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
break;
}
}
}
return 1;
}
4. 卸载托盘。
当应用程序退出时,卸载
NOTIFYICONDATA notifyicondata;
notifyicondata.cbSize = sizeof(NOTIFYICONDATA);
notifyicondata.uFlags = 0;
notifyicondata.hWnd = m_hWnd;
notifyicondata.uID = IDI_NOTIFYICON;
Shell_NotifyIcon(NIM_DELETE, ¬ifyicondata);//卸载托盘图标
NOTIFYICONDATA结构体的uCallbackMessage变量,使得用户消息响应与托盘的点击等消息关联在一起;托盘的标识IDI_NOTIFYICON,恰好是用户消息响应用来判断是否是托盘传递的消息的依据;
在基于多文档或单文档的应用程序,当用户点击最小化按钮时,我们可以讲界面隐藏;
具体是,添加OnSize()消息
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);
if(nType == SIZE_MINIMIZED)
{
ShowWindow(SW_HIDE); // 当最小化时,隐藏主窗口
}
// TODO: 在此处添加消息处理程序代码
}
对话框的最小化托盘于此很类似,可以参考:http://justtotry.blog.163.com/blog/static/446308122011622101427208/
MFC为应用程序添加托盘(右键托盘,弹出菜单)的更多相关文章
- 【技术贴】7-zip 7z关联右键菜单后右键不弹出菜单的解决办法
解决7z,7zip右键菜单 失效 右键菜单 无法弹出右键菜单 不正常 右键菜单 sb等各种疑难杂症. 1.首先先去7z的选项里面把右键关联给设置了. 用的好好的7z,正吃着火锅唱着歌忽然发现右键单文件 ...
- c#右键窗体弹出菜单
在工具箱(快捷键ctrl+w+x)——菜单和工具栏中找到 在属性中用这个绑定 然后写后台代码
- 将程序添加到右键菜单和图标(以记事本、UltraEdit为例)
原文:将程序添加到右键菜单(以记事本.UltraEdit为例) 如何将程序加入右键菜单,这里分别以记事本.UltraEdit为例! 以记事本程序为例: 1. 在运行中输入regedit,打开注册表,找 ...
- win32进阶之路:程序托盘图标+右键弹出菜单
开场白 本次介绍两个非常棒且实用的技巧:程序托盘图标和右键弹出菜单,效果如下图. 程序托盘图标用了迅雷的图标,右键点击时候会弹出三个选项的菜单. 程序托盘图标设置 我会用尽可能清晰明了的步骤介绍方式 ...
- vc++ 如何添加右键弹出菜单
一.创建新工程 二.编辑菜单资源 1.添加菜单 按"Ctrl+R",双击"Menu"图标 2.于菜单编辑器内编辑菜单 四.添加代码(红色部分) void CCM ...
- SWT中的Tree中 添加右键弹出菜单
先看一下效果: 如图:在树上单击鼠标右键会弹出 弹出式菜单.做法其实很简单,先做一个树: final TreeViewer treeViewer = new TreeViewer(group, SWT ...
- 关于MFC主菜单和右键弹出菜单
一.主菜单.弹出菜单和右键菜单的概念: 主菜单是窗口顶部的菜单,一个窗口或对话框只能有一个主菜单,但是主菜单可以被更改(SetMenu()更改): 创建方式:CMenu::CreateMenu(voi ...
- 如何设置secureCRT的鼠标右键为弹出文本操作菜单功能
secureCRT的鼠标右键功能默认是粘贴的功能,用起来和windows系统的风格不一致, 如果要改为右键为弹出文本操作菜单功能,方便对选择的内容做拷贝编辑操作,可以在 options菜单----&g ...
- 获得其他程序弹出菜单的内容(一个困扰许久的问题o(╯□╰)o)
刚开始到现在公司的时候接到一个任务:开发一个activex控件,自动操作本地exe程序,当时遇到弹出菜单无法获取的问题,还好不影响,最近又遇到这个问题,绕不过去了,于是昨天花了一个上午百度了个遍,总算 ...
随机推荐
- Android百度地图定位
在谈到百度地图.如今,每个人都知道这个时候应该可以了吧.而更多的字不拉.直接朝话题. 访问百度地图api您必须应用key,应用在这里key不用说,有官方的文件说明如何应用上述key. 在这里,百度地图 ...
- Dalvik虚拟机的优化机制
Dalvik虚拟机设计作为Android系统定制虚拟机, 在移动设备上运行,必须要比普通的Java虚拟机有更多的优化手段和机制, 以下就列举出其中主要的一些优化机制: 1. 使用dex格式的类文件,可 ...
- 字符设备驱动1:新的方式添加cdev + 在open函数中将文件私有数据指向设备结构体
本例中,驱动入口处,使用cdev_add添加驱动,这点也可与字符设备驱动0:一个简单但完整的字符设备驱动程序对比一下. 另外主要讲xx_open实现文件私有数据指向设备结构体. 引子: 偶然看到,在j ...
- 配置SecureCRT连接Linux CentOS
链接地址:http://f.dataguru.cn/thread-144513-1-1.html 环境:Linux:centos5.8虚拟机:VirtualBox本机:windows至于怎么安装Cen ...
- MAC安裝《Genymotion Android模擬器》大玩Android APP (神魔之塔)
链接地址:http://www.minwt.com/mac/10083.html/comment-page-2 MAC» 智慧型裝罝» Android | 2014/02/12 Android是一個開 ...
- HttpResponseRedirect VS HttpResponse
当我们处理了post提交的数据之后,我们使用HttpResponseRedirect跳转到另一个页面,而不是用HttpResponse. 例如当一个投票环节时使用HttpResponse可以使用浏览器 ...
- Week12(11月28日)
Part I:提问 =========================== 1.解读以下代码 $(document).ready(function(){ $('#btn1').click(fun ...
- [置顶] 深入ResourceBundle
ResourceBundle是java开发中非常实用的一个类,主要用来处理应用程序多语言这样的国际化问题. 如果你的应用程序如果有国际化的需求,可以考虑使用ResourceBundle, 你要做的就是 ...
- Elven Postman(二叉树)
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- [置顶] C++ sizeof实例详解
在C++中使用sizeof要比C复杂很多,因为C++类中有static静态变量,virtual虚函数,还有继承.派生等.sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是 ...