vc中如何获取WM_CLOSE消息????

vc中如何获取WM_CLOSE消息????,第1张

(一) 原理

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类中应该可以找到这个消息

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/13494862.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-09-01
下一篇2025-09-01

发表评论

登录后才能评论

评论列表(0条)

    保存