MFC最小化到系统托盘

上传人:ths****59 文档编号:57600450 上传时间:2018-10-23 格式:DOC 页数:7 大小:54KB
返回 下载 相关 举报
MFC最小化到系统托盘_第1页
第1页 / 共7页
MFC最小化到系统托盘_第2页
第2页 / 共7页
MFC最小化到系统托盘_第3页
第3页 / 共7页
MFC最小化到系统托盘_第4页
第4页 / 共7页
MFC最小化到系统托盘_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《MFC最小化到系统托盘》由会员分享,可在线阅读,更多相关《MFC最小化到系统托盘(7页珍藏版)》请在金锄头文库上搜索。

1、转 MFC 最小化到系统托盘一、托盘简介 所谓的“托盘”,在 Windows 系统界面中,指的就是下面任务条右侧,有系统时间等 等的标志的那一部分。在程序最小化或挂起时,但有不希望占据任务栏的时候,就可以把 程序放到托盘区。其实,托盘区的编程很简单,下面简要阐述一下子喽_ 二、托盘编程相关函数 其实呢,把程序放到托盘上的本质就是先在托盘区绘制一个图标,然后把程序隐藏 不见,再对托盘的图标进行消息处理,就可以了。 绘制图标以及确定图标所传送消息的函数只有一个,那就是 WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIF

2、YICONDATA pnid ); 这个函数呢,负责向系统传递消息,以添加、修改或删除托盘区的图标。她的返回 值呢,是个布尔类型的。就是说,如果返回 0,那就是成仁啦,非 0 才成功。 参数 dwMessage 是表示这个函数的应用功能是哪一方面,是添加、删除,还是修 改图标。如果是添加,则它的值为值为 NIM_ADD;删除则是;删除则是 NIM_DELETE;而修改是 NIM_MODIFY。参数 pnid 就是具体的和程序在托盘区的图标有关系的结构了。它的定义 如下: typedef struct _NOTIFYICONDATA DWORD cbSize; HWND hWnd; UINT u

3、ID; UINT uFlags; UINT uCallbackMessage; HICON hIcon; char szTip64; NOTIFYICONDATA, *PNOTIFYICONDATA; 下面就对该结构各个参数进行刨析: cbSize : 结构的长度,用“位”来做单位。一般在程序中,我们用(DWORD) sizeof(NOTIFYICONDATA) 给它赋值。 HWnd : 一个句柄,如果对托盘中的图标进行操作,相应的消息就传给这个句柄所代表的窗口。自然了,大多数情况下是 this-m_hWnd 喽。 uID : 在工程中定义的图标 ID uFlags : 这个成员标志着其他哪些

4、成员的数据是有效的,分别为 NIF_ICON, NIF_MESSAGE, NIF_TIP,分别代表着数据有效的成员是 hIcon, uCallbackMessage, szTip。当然,三个值可以用“|”联系到一起。下面分别对涉及到的成员进行阐述 hIcon : 要增加,删除或修改的图标句柄。如果只知道个 uID, 一般可能会用函 数 LoadIcon 来得到句柄。例如 LoadIcon ( AfxGetInstanceHandle() ,MAKEINTRESOURCE (IDR_MAINFRAME) )。 uCallbackMessage : 这在对托盘区的操作中,是比较重要的数据成员。这是

5、个消这在对托盘区的操作中,是比较重要的数据成员。这是个消 息标志,当用鼠标对托盘区相应图标进行操作的时候,就会传递消息给息标志,当用鼠标对托盘区相应图标进行操作的时候,就会传递消息给 Hwnd 所代表的窗所代表的窗 口。所以说,口。所以说, 在在 uFlags 中,一般都得标志它有效。这里一般都是自定义的消息中,一般都得标志它有效。这里一般都是自定义的消息。 szTip : 鼠标移动到托盘图标上时的提示文字。在 MFC 中怎样将窗口最小化到托盘?(一) 原理 1.最小化的原理:首先要将窗口隐藏,然后 在右下角绘制图标。 2.恢复的原理:将窗口显示,再将托盘中的图片删除。 3.消息声明与消息响应

6、函数的机制原理。 (二) 程序描述1. 先定义自己消息声明与消息响应函数。 消息响应函数处理当用户左键双击与右键点击托盘 2. 定义处理窗口最小化时候调用的函数。 调用的函数中完成托盘样式、托盘上显示的文字、对应的消息等等。具体查看NOTIFYICONDATA 结构与代码。 3.当用户最小化窗口时候,OnSysCommand 捕捉到对应消息,并调用创建 托盘函数(三)程序实现 1、自定义消息 WM_SHOWTASK: #define WM_SHOWTASK (WM_USER +1) 2、在 MFC 的:OnSysCommand(UINT nID, LPARAM lParam)函数体中增加一 个

7、命令响应 if(nID=SC_MINIMIZE) ToTray(); /最小化到托盘的函数 3、在消息映射中添加 ON_MESSAGE(WM_SHOWTASK,OnShowTask),其中WM_SHOWTASK 是消息名, OnShowTask 是自己定义的消息响应函数,后面有说明。 (四)具体函数内容 1、最小化到托盘函数 void CClockDlg:OnCreateNotifyIcon( ) nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this-m_hWnd; nid.uID=IDR_MAINFRAME;nid.uFlags=NI

8、F_ICON|NIF_MESSAGE|NIF_TIP ;nid.uCallbackMessage=WM_SHOWTASK;/自定义的消息名称nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME);strcpy(nid.szTip,“程序名称“); /信息提示条Shell_NotifyIcon(NIM_ADD, /在托盘区添加图标ShowWindow(SW_HIDE); /隐藏主窗口 2、恢复界面函数 在头文件中定义消息响应函数 afx_msg LRESULT OnShowTask(WPARAM wPara

9、m,LPARAM lParam) ; /wParam接收的是图标的ID,而lParam接收的是鼠标的行为 LRESULT LRESULT CClockDlg:OnShowTask(WPARAM wParam,LPARAM lParam) if(wParam!=nid.uID) MessageBox(“heloo“); return 1; switch(lParam) case WM_RBUTTONUP:/右键起来时弹出快捷菜单,这里只有一个“关闭” LPPOINT lpoint=new tagPOINT; :GetCursorPos(lpoint);/得到鼠标位置/声明一个弹出式菜单CMenu

10、 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:/双击左键的处理 MoveWindo

11、w(GetSystemMetrics(SM_CXSCREEN)-dlgrect.Width()-20, 0, dlgrect.Width(), dlgrect.Height(), true);this-ShowWindow(SW_SHOWNORMAL);DeleteTray(); break; default: break; return 0; 3、删除托盘图标函数 void CClockDlg:DeleteTray() NOTIFYICONDATA nid;nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this-m_hWnd; nid.

12、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_DELETE, /在托盘区删除图标我只想自己实现 SC_CLOSE, 而不想覆盖其他的 SysCommand, void

13、 CMainFrame:OnSysCommand( UINT nID, LPARAM lParam ) if( nID = SC_CLOSE ) /自己的实现代码 但我发现框架运行后,其他的 SysCommand,如 Maximize, Minimize, Move, Restore 等都没法实现了,难道每个 SysCommand 都要自己实现一遍吗? 请问如何解决? 在 else 里加上 CFrameWnd:OnSysCommand(nID, lParam); 也就是 if( nID = SC_CLOSE ) /自己的实现代码 else CFrameWnd:OnSysCommand(nID,

14、 lParam); 到底到底 OnSysCommand 可不可以在可不可以在 CFrameWnd 中重载中重载可以啊,我一直这么做: .h 文件的消息定义处添加: afx_msg void OnSysCommand(UINT nID, LPARAM lParam); .cpp 文件的消息响应处添加: ON_WM_SYSCOMMAND() .cpp 文件添加处理函数: void CYourFrameWnd:OnSysCommand(UINT nID, LPARAM lParam) CFrameWnd:OnSysCommand(nID, lParam); 窗口最大化、最小化及关闭的消息是什么?如何

15、截获? VC 与 boland C 一样 最大化、最小化将发送 WM_SYSCOMMAND 消息。要处理该消息,可以这么做: 1、在 Form 的头文件中添加: void _fastcall RestrictMinimizeMaximize(TMessage BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, RestrictMinimizeMaximize) END_MESSAGE_MAP(TForm) 2、在 Form 的单元文件中添加: void _fastcall TForm1:RestrictMinimizeMaximize(TMessage / or “else TForm:Dispat

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号