MFC最小化到系统托盘.doc_第1页
MFC最小化到系统托盘.doc_第2页
MFC最小化到系统托盘.doc_第3页
MFC最小化到系统托盘.doc_第4页
MFC最小化到系统托盘.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

转 MFC最小化到系统托盘一、托盘简介 所谓的“托盘”,在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 szTip64; 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 : 鼠标移动到托盘图标上时的提示文字。在MFC中怎样将窗口最小化到托盘?(一) 原理 1.最小化的原理:首先要将窗口隐藏,然后 在右下角绘制图标。 2.恢复的原理:将窗口显示,再将托盘中的图片删除。 3.消息声明与消息响应函数的机制原理。(二) 程序描述1. 先定义自己消息声明与消息响应函数。消息响应函数处理当用户左键双击与右键点击托盘2. 定义处理窗口最小化时候调用的函数。调用的函数中完成托盘样式、托盘上显示的文字、对应的消息等等。具体查看NOTIFYICONDATA结构与代码。3.当用户最小化窗口时候,OnSysCommand捕捉到对应消息,并调用创建托盘函数(三)程序实现 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是自己定义的消息响应函数,后面有说明。 (四)具体函数内容 1、最小化到托盘函数 void CClockDlg:OnCreateNotifyIcon( ) 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,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 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:/双击左键的处理 MoveWindow(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.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,&nid); /在托盘区删除图标 我只想自己实现SC_CLOSE, 而不想覆盖其他的SysCommand, void 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, 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); 窗口最大化、最小化及关闭的消息是什么?如何截获?VC与boland C一样 最大化、最小化将发送WM_SYSCOMMAND消息。要处理该消息,可以这么做: 1、在Form的头文件中添加: void _fastcall RestrictMinimizeMaximize(TMessage &Msg); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, RestrictMinimizeMaximize) END_MESSAGE_MAP(TForm) 2、在Form的单元文件中添加: void _fastcall TForm1:RestrictMinimizeMaximize(TMessage& Msg) if (Msg.WParam = SC_MINIMIZE) /catches minimize. else if (Msg.WParam = SC_MAXIMIZE) /catches maximize. else if (Msg.WParam = SC_CLOSE) TForm:Dispatch(&Msg); / or else TForm:Dispatch(&Msg) to trap 关闭窗口的消息为WM_CLOSE,C+Builder提供了OnClose事件。 void CClockDlg:OnSysCommand(UINT nID, LPARAM lParam)/ TODO: 在此添加消息处理程序代码和/或调用默认值 if( nID = SC_MINIMIZE ) CDialog:OnSysCommand(nID, lParam);消息发送SendMessage()函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。 函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam); 参数: hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。 Msg:指定被发送的消息。 wParam:指定附加的消息指定信息。 IParam:指定附加的消息指定信息。 返回值:返回值指定消息处理的结果,依赖于所发送的消息。 备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。错误一:error C2440: “static_c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论