VC++中把一个对话框最小化到托盘[转载]

From: http://hi.baidu.com/maxlcl/blog/item/61e83c87de35e529c65cc3e0.html

一、托盘简介 

所谓的“托盘”,在Windows系统界面中,指的就是下面任务条右侧,有系统时间等等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把程序放到托盘区。 

二、托盘编程相关函数 

把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏不见,再对托盘的图标进行消息处理,就可以了。 

绘制图标以及确定图标所传送消息的函数只有一个: 

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( 
DWORD dwMessage, 
PNOTIFYICONDATA pnid 
); 

这个函数,负责向系统传递消息,以添加、修改或删除托盘区的图标。 

参数dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修改图标。如果是添加,则它的值为NIM_ADD;删除则是NIM_DELETE;而修改是NIM_MODIFY。参数pnid就是具体的和程序在托盘区的图标有关系的结构了。它的定义如下: 

typedef struct _NOTIFYICONDATAA {DWORD cbSize;HWND hWnd;UINT uID;UINT uFlags;UINT uCallbackMessage;HICON hIcon;CHAR   szTip[64];
} NOTIFYICONDATAA, *PNOTIFYICONDATAA;


下面就对该结构各个参数进行刨析: 

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、将程序最小化到系统托盘区的函数:添加一个按钮的点击事件。 
 
void CDdDlg::OnBtnHide()									// 隐藏主窗口,显示到系统托盘区
{NOTIFYICONDATA nid; 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);									// 隐藏主窗口
}


这是个很简单的函数,里面首先给NOTIFYICONDATA赋值,然后调用shell_NotifyIcon, 头一个参数是NIM_ADD,表示添加。然后用函数ShowWindow 隐藏主窗口,这样,就实现了将程序最小化到系统托盘区的任务了。 

2、程序已经最小化到托盘区了,但是对托盘图标的操作如何进行呢?这就体现了结构NOTIFYICONDATA的成员uCallbackMessage 的作用了。它所提供的作用就是,当用户用鼠标点击托盘区的图标的时候(无论是左键还是右键),会向hWnd所代表的窗口传送消息. 
如上例,我们自定义了消息WM_SHOWTASK。根据VC的消息机制,对自定义消息增加消息响应函数. 

在*Dlg.cpp文件上面定义一个用户消息: 
#define WM_SHOWTASK (WM_USER + 2012) 

在头文件的//{{AFX_MSG和//}}AFX_MSG之间声明消息响应函数: 

afx_msg LRESULT onShowTask(WPARAM wParam,LPARAM lParam);  

然后在CPP文件中添加消息映射。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP 之间加入: ON_MESSAGE(WM_SHOWTASK,onShowTask)将消息和消息响应函数映射起来。 

然后就是在CPP文件中加入函数onShowTask的实现了: 

LRESULT CDdDlg::onShowTask(WPARAM wParam, LPARAM lParam)	// wParam接收的是图标的ID,而lParam接收的是鼠标的行为 
{ if(wParam != IDR_MAINFRAME)return 1; switch(lParam) { case WM_RBUTTONUP:										//右键菜单 {LPPOINT lpoint = new tagPOINT; ::GetCursorPos(lpoint);							// 得到鼠标位置 CMenu menu; menu.CreatePopupMenu();							// 创建一个弹出式菜单 //增加菜单项“关闭”,点击则发送消息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_SHOW);						// 显示主窗口} break;}return 0; 
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406500.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-ui cascader 级联选择器 存最后一级id及回显

:props"{emitPath:false}" 加上这行就可以&#xff0c;只存最后一级id&#xff0c;且以最后一级id完整回显。<el-cascader expand-trigger"click" placeholder"请输入" filterable clearable:props"{emitPath:false}":options"…

freebsd点到点的ipsec ***

使用 FreeBSD 网关在两个被 Internet 分开的网络之间架设 ,以实现两个网络通过通道互访&#xff0c;IPsec 是一种建立在 Internet 协议 (IP) 层之上的协议&#xff0c;它能够让两个或更多主机以安全的方式来通讯&#xff0c;IPsec 既可以用来直接加密主机之间的网络通讯 (也就是…

怎么使用7zip进行分批压缩_怎么使用钢结构抛丸机对钢结构进行除锈?

我们生活中所见的钢结构用的时间长了以后都会产生锈渍&#xff0c;表面还会存在各种污浊物&#xff0c;所以说除锈处理是钢结构生产环节的一道主要工序&#xff0c;如果处理不好直接影响钢结构的品质和质量&#xff0c;使钢结构的维修周期缩短或影响使用寿命&#xff0c;有时会…

Taro+react开发(62) 开发者工具修改为网页调试

点击微信开发者工具---更改开发模式---网页模式

(简单) POJ 3984 迷宫问题,BFS。

Description 定义一个二维数组&#xff1a; int maze[5][5] {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走或竖着走&#xff0c;不能斜着走&…

一个托盘程序演示 -闹钟 Alert

From: http://www.vckbase.com/document/viewdoc/?id996 下载源代码 关键字&#xff1a;托盘 Tray   想必大家都看见过那些在系统托盘&#xff08;Tray&#xff09;中的程序吧&#xff0c;本文就演示了如何创建一个这样的托盘程序Alert。Alert是一个运行在系统托盘中的小…

watch的immediate使用

vue中watch不触发、不生效的解决办法及原理 Vue watch监听路由不生效&#xff0c;没反应 watch的immediate使用

[转]ODAC 应用技巧 (一)使用 ODAC 的 Net 方式

原文地址&#xff1a;ODAC 应用技巧 &#xff08;一&#xff09;使用 ODAC 的 Net 方式 使用 ODAC 的 Net 方式 nxyc_twz163.com 大多数应用程序使用 OCI 的ODAC 标准方式来连接 Oracle 数据库服务器。这是使用第三方开发语言设计 Oracle 应用程序最常用的方法。 所有的 OCI …

adam算法效果差原因_冷库制冷效果差原因

冷库常见的现象有冷库温度降不下来和下降缓慢的时候&#xff0c;现在对库温下降缓慢的原因简单分析&#xff1a;1、冷库工程由于隔热或密封性能差&#xff0c;导致冷量损耗大隔热性能差是由于管道、库房隔热墙等的保温层厚度不够&#xff0c;隔热和保温效果不良&#xff0c;它主…

解决hive交互模式退格键乱码

在hive的交互模式下&#xff0c;输入退格、方向键等&#xff0c;出现乱码&#xff0c;可以通过如下方法解决&#xff1a; 1、修改bashrc文件&#xff1a; vi ~/.bashrc 在文件最后添加一行&#xff1a; stty erase ^H。 2、使修改生效&#xff1a; source ~/.bashrc 这样&#…

element弹框的的this.$alert、this.$prompt方法用法

element弹框的的this.alert、this.alert、this.alert、this.prompt方法用法

VS2010删除所有断点时不弹出提示窗口

用VS.NET平台程序时&#xff0c;如何才能在删除所有断点时不弹出提示窗口呢&#xff1f;请看下图&#xff0c;马上明白&#xff1a;

如何使用Chrome的Network面板分析HTTP报文

Chrome教程之NetWork面板分析网络请求 如何使用Chrome的Network面板分析HTTP报文

关于Eclipse基本设置(字体大小、项目导入、简单)

1、如果事先你用其他软件写好了一个项目文件夹&#xff0c;导入到Eclipse继续编辑&#xff0c;可以&#xff1a; 打开File→Import→Genral→File System→ Next &#xff0c;然后选择文件夹&#xff08;建议在导入之前&#xff0c;先建立一个工程object&#xff09; 2、字体大…

多通道_人机交互界面的多通道RGB LED驱动设计

现在的产品变得非常智能且彼此相互连接。扬声器、电视、冰箱、机顶盒和烟雾探测器等器件不再只是处在某一位置的工具 - 用户可远程或通过语音唤醒控制它们。这些器件比以前更加智能&#xff0c;这意味着它们还需要更加智慧的人机交互界面。  人机交互的界面可以多种多样&…

转,rsa算法

[编辑] 公钥和私钥的产生 假设Alice想要通过一个不可靠的媒体接收Bob的一条私人訊息。她可以用以下的方式来产生一个公钥和一个私钥&#xff1a;随意选择两个大的质数p和q&#xff0c;p不等于q&#xff0c;计算Npq。 根据歐拉函數&#xff0c;不大于N且与N互质的整数个数为(p-1…

VC按最小化、关闭按钮、Esc都隐藏主窗口

VC按最小化、关闭按钮、Esc键都隐藏主窗口&#xff0c;在托盘处程序图标的右键菜单中点击&#xff0c;显示主窗口。 1. 按最小化时隐藏主窗口&#xff1a;为窗口添加WM_SIZE消息响应函数 void CdDlg::OnSize(UINT nType, int cx, int cy) {CDialogEx::OnSize(nType, cx, cy);i…

越是聪明人越要懂得下笨功夫!

很多人认为聪明的人才会成功&#xff0c;其实&#xff0c;事情恰恰相反。 很多聪明的人做事情往往难以成功。人们常说“聪明反被聪明误”&#xff0c;说的就是这个道理。很多聪明人做事情不能成功&#xff0c;原因有二&#xff1a;一是不能下笨功夫&#xff1b;二是他们没有找到…

Taro+react开发(65):h5全局重置背景样式

.taro_page{height:100% }.onlineQuetion_body{background: linear-gradient(0deg,#5a70a6,#5c7cc9);height:100%; } body,html{height:100%; }