VC++ 最小化到托盘、恢复
所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。
一、托盘编程相关函数
把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。
绘制图标以及确定图标所传送消息的函数只有一个:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid);
这个函数负责向系统传递消息,以添加、修改或删除托盘区的图标。返回值是个布尔类型的。就是说,如果返回0,那就是成仁啦,非0才成功。参数dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修改图标。如果是添加,则它的值为NIM_ADD;删除则是NIM_DELETE;而修改是NIM_MODIFY。参数pnid就是具体的和程序在托盘区的图标有关系的结构了。它的定义如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[];
} NOTIFYICONDATA, *PNOTIFYICONDATA;
下面就对该结构各个参数进行刨析:
cbSize : 结构的长度,用“位”来做单位。一般在程序中,我们用(DWORD)sizeof(NOTIFYICONDATA) 给它赋值。
HWnd : 一个句柄,如果对托盘中的图标进行操作,相应的消息就传给这个句柄所代表的窗口。自然了,大多数情况下是this->m_hWnd喽。
uID : 在工程中定义的图标ID
uFlags : 这个成员标志着其他哪些成员的数据是有效的,分别为NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是hIcon, uCallbackMessage, szTip。当然,三个值可以用“|”联系到一起。下面分别对涉及到的成员进行阐述
hIcon : 要增加,删除或修改的图标句柄。如果只知道个uID, 一般可能会用函数LoadIcon来得到句柄。例如LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。
uCallbackMessage : 这在对托盘区的操作中,是比较重要的数据成员。这是个消息标志,当用鼠标对托盘区相应图标进行操作的时候,就会传递消息给Hwnd所代表的窗口。所以说,在uFlags中,一般都得标志它有效。这里一般都是自定义的消息。
szTip : 鼠标移动到托盘图标上时的提示文字。
二、原理
1、最小化的原理:首先要将窗口隐藏,然后 在右下角绘制图标。
2、恢复的原理:将窗口显示,再将托盘中的图片删除。
三、程序实现
1、自定义消息WM_SHOWTASK: #define WM_SHOWTASK (WM_USER +1)
2、在MFC的::OnSysCommand(UINT nID, LPARAM lParam)函数体中增加一个命令响应
if(nID==SC_MINIMIZE) ToTray(); //最小化到托盘的函数
3、在消息映射中添加 ON_MESSAGE(WM_SHOWTASK,OnShowTask),其中WM_SHOWTASK是消息名,OnShowTask是自己定义的消息响应函数,后面有说明。
四、具体函数内容
NOTIFYICONDATA nid; //定义为成员变量
1、最小化到托盘函数
void CMyDlg::ToTray(){ nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this->m_hWnd;
nid.uID=IDR_MAINFRAME;
nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
nid.uCallbackMessage=WM_SHOWTASK;//自定义的消息名称
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"计划任务提醒");//信息提示条为“计划任务提醒”
Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标
ShowWindow(SW_HIDE);//隐藏主窗口 }
2、恢复界面函数
在头文件中定义消息响应函数afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAMlParam) ;//wParam接收的是图标的ID,而lParam接收的是鼠标的行为
LRESULT CMyDlg::OnShowTask(WPARAM wParam,LPARAM lParam) { if(wParam!=IDR_MAINFRAME)
return ;
switch(lParam)
{
case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”
{
LPPOINT lpoint=new tagPOINT;
::GetCursorPos(lpoint);//得到鼠标位置
CMenu menu;
menu.CreatePopupMenu();//声明一个弹出式菜单
//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已
//隐藏),将程序结束。
menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭");
menu.AppendMenu(MF_STRING,WM_DESTROY,"显示");
//确定弹出式菜单的位置
menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
//资源回收
HMENU hmenu=menu.Detach();
menu.DestroyMenu();
delete lpoint;
}
break;
case WM_LBUTTONDBLCLK://双击左键的处理
{
this->ShowWindow(SW_SHOWNORMAL);//简单的显示主窗口
}
break;
}
return ; }
3、为使应用程序退出时图标消失,映射WM_DESTROY消息,在OnDestroy()函数中加入:
Shell_NotifyIcon(NIM_DELETE,&nid);
VC++ 最小化到托盘、恢复的更多相关文章
- vc++ 最小化到托盘的详细实现
在VC++中,想实现将MFC最小化到系统托盘,需要调用NOTIFYICONDATA类,并注册相应的消息,以下详细讲解如何实现: 1.声明一个NOTIFYICONDATA类,也就是NOTIFYICOND ...
- VC最小化到托盘程序
在实际操作电脑的过程中,我们常常可以看到一些应用程序可以最小化到桌面右下角的托盘中显示,如一些杀毒软件等开机就显示在托盘中,或是我们常用的QQ等聊天工具,都可以最小化在托盘中,如图-1. 在图-1中, ...
- C++ 最小化到托盘
#define WM_SHOWTASK (WM_USER + 1) void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID &a ...
- MFC窗口实现最小化到托盘 右键菜单和还原
//.h文件 void toTray();//最小化到托盘 void DeleteTray();//删除托盘图标 afx_msg LRESULT OnShowTask(WPARAM wParam,LP ...
- WPF实现窗口最小化到托盘,并且实现右击菜单
原版是从网上找了一位大神的,自己只是用了一点适合自己的. 具体实现 1.首先已经确认WPF中没有实现最小化托盘的类与方法,用到了winform中的程序集 using Drawing = System. ...
- outlook新邮件到达提醒设置以及outlook最小化到托盘设置
有些邮件是需要马上处理的,因此希望能在收到邮件之后马上就知道,但是有不希望频繁的去检查有没有.outlook可以帮我们轻松做到新邮件到达提醒. 一 .设置outlook新邮件到达提醒:选项->电 ...
- (WinForm)文件夹状态监控,最小化到托盘,开机自启动
原文 (WinForm)文件夹状态监控,最小化到托盘,开机自启动 . 文件夾監控(監測文件夾中的文件動態): //MSDN上的例子 public class Watcher { public stat ...
- WinForm 之 窗口最小化到托盘及右键图标显示菜单
Form最小化是指整个Form都缩小到任务栏上,但是窗体以Form的标题栏形式显示在任务栏上, 若是想让Form以Icon的形式显示在任务栏右下角,则需要给Form添加一个NotifyIcon控件. ...
- C# 最小化到托盘,托盘右击菜单显示
添加notifyIcon控件,并添加Icon,否则托盘没有图标(托盘右键菜单也可直接在属性里添加): 主要的代码: public partial class Form1 : Form { #regio ...
随机推荐
- Codeforces Round #381 (Div. 2)C. Alyona and mex(思维)
C. Alyona and mex Problem Description: Alyona's mother wants to present an array of n non-negative i ...
- ACM入门
1.给n个数字,将它们重新排序得到一个最大的数字 例子 4123 124 56 90--------------90561241235123 124 56 90 9------------990561 ...
- 为什么使用 Redis及其产品定位
摘自:http://www.infoq.com/cn/articles/tq-why-choose-redis 传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储 ...
- spring mvc 删除返回字符串中值为null的字段
在spring的配置文件中进行一下配置: <bean class="org.springframework.web.servlet.mvc.method.annotation.Requ ...
- exp导出做成批处理注意事项
不能叫exp.bat,会一直显示导出这句话. 出现EXP-00106: 数据库链接口令无效:是因为http://blog.csdn.net/hzfu007/article/details/189823 ...
- [Linux编程]__read_mostly变量含义
1.定义 __read_mostly原语将定义的变量为存放在.data.read_mostly段中,原型在include/asm/cache.h 中定义: #define __read_mostly ...
- ORACLE10gRAC数据库迁移至10gRAC
1.数据库备份RUN {ALLOCATE CHANNEL ch00 DEVICE TYPE disk;ALLOCATE CHANNEL ch01 DEVICE TYPE disk;ALLOCATE C ...
- centOS安装网卡驱动
作为一个小白来说,安装驱动之类的真是无心下手的感觉,在学习了http://www.centoscn.com/image-text/config/2013/0816/1269.html这篇帖子的步骤之后 ...
- git上传到阿里云code
一.在阿里云code(kelude)注册用户,新建项目.二.安装Git后使用GitBash生产ssh key:(https://zhidao.baidu.com/question/1303468264 ...
- python 中变量的命名方法
从网上找到django中python的命名规范 Python 规范 代码的布局 编码 所有的Python脚本文件都应在文件头标上“# -*- coding:utf-8 -*-”. 缩进 4个空格 ...