
(一) 原理
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是自己定义的消息响应函数,后面有说明。
(三)具体函数内容
1、最小化到托盘函数
void CMyDlg::ToTray(){ NOTIFYICONDATA nid; nidcbSize=(DWORD)sizeof(NOTIFYICONDATA); nidhWnd=this->m_hWnd; niduID=IDR_MAINFRAME; niduFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; niduCallbackMessage=WM_SHOWTASK;//自定义的消息名称 nidhIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(nidszTip,"程序名称"); //信息提示条 Shell_NotifyIcon(NIM_ADD,&nid); //在托盘区添加图标 ShowWindow(SW_HIDE); //隐藏主窗口}
2、恢复界面函数
在头文件中定义消息响应函数afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam) ;
//wParam接收的是图标的ID,而lParam接收的是鼠标的行为 LRESULT CMyDlg::OnShowTask(WPARAM wParam,LPARAM lParam) { if(wParam!=IDR_MAINFRAME) return 1; switch(lParam) { case WM_RBUTTONUP://右键起来时d出快捷菜单,这里只有一个“关闭” { LPPOINT lpoint=new tagPOINT; ::GetCursorPos(lpoint);//得到鼠标位置 CMenu menu; menuCreatePopupMenu();//声明一个d出式菜单 //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 //隐藏),将程序结束。 menuAppendMenu(MF_STRING,WM_DESTROY,"关闭"); //确定d出式菜单的位置 menuTrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); //资源回收 HMENU hmenu=menuDetach(); menuDestroyMenu(); delete lpoint; } break; case WM_LBUTTONDBLCLK://双击左键的处理 { this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿 DeleteTray(); } break; default: break; } return 0; }
3、删除托盘图标函数
void CMyDlg::DeleteTray(){ NOTIFYICONDATA nid; nidcbSize=(DWORD)sizeof(NOTIFYICONDATA); nidhWnd=this->m_hWnd; niduID=IDR_MAINFRAME; niduFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; niduCallbackMessage=WM_SHOWTASK;//自定义的消息名称 nidhIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(nidszTip,"程序名称"); //信息提示条为“计划任务提醒” Shell_NotifyIcon(NIM_DELETE,&nid); //在托盘区删除图标 }
在类名CMySDOpenGLView上单击右键, 选add windows message handler然后顺d出的对话框中左侧选择消息名,单击add handler 即可
pDoc->UpdateAllViews(NULL);
//pDoc文档指针
或者OnDraw();
SendMessage(WM_PAINT);诸类
另外
MFC中关于对话框刷新的函数是:
void Invalidate(
BOOL bErase = TRUE
);
这个函数是用来强制更新窗口重绘的,UpdateData()是用来交换数据的
MFC的消息处理函数
1AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc
2AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数
3WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数
4OnWndMsg() 该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数
5OnCommand() 该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数
6OnCmdMsg() 根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数
没有WM_VSCROLL这个消息类型 就说明这个你选择的这个类不能处理这个消息
需要在选择别的类来处理MFC中每个消息 并不是所有类都能处理的 还要看消息的类型
就你目前生成的类来看 至少在CMainFrame类中应该可以找到这个消息
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)