我们有的时候为了屏蔽右上角关闭按钮,这样写代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//右上角关闭按钮 void CUpdateProgramDlg::OnClose() { //AfxMessageBox("OnClose"); //CDialog::OnClose(); } //取消按钮 void CUpdateProgramDlg::OnCancel() { //AfxMessageBox("OnCancel"); //CDialog::OnCancel(); } |
但是这样写程序怎样退出呢?
正常写法 ::SendMessage(hWnd,WM_CLOSE,0,0);
但是用了上面代码屏蔽右上角关闭按钮以后,以上关闭窗体的代码也无效了。 我是没有想出什么好办法退出程序,希望某高手看见给出极品代码。
于是本人翻阅各种资料总结如下给大家分享,请大神们不要丢我 - -!
MFC关闭窗体流程:
流程一:当点击右上角关闭按钮时,流程如下:
1.窗口关闭的时候会给窗口过程发送一个WM_SYSCOMMAND消息。如:SendMessage(WM_SYSCOMMAND, SC_CLOSE, NULL);
2.窗口过程接收到WM_SYSCOMMAND消息后,会调用DefWindowProc来发送一个WM_CLOSE消息
3.如果不处理WM_CLOSE消息,DefWindowProc会默认调用DestroyWindow来发送WM_DESTROY消息
4.接收到WM_DESTROY消息后,调用PostQuitMessage发送WM_QUIT消息
5.CWinApp::Run收到WM_QUIT后结束内部消息循环,并调用ExinInstance函数,它是CWinApp的一个虚拟函数,可以由用户重载。
6.最后回到AfxWinMain,执行AfxWinTerm,结束程序。
流程二:当调用::SendMessage(AfxGetApp->GetMainWnd(),WM_CLOSE,0,0);方法时,流程如下:
1.发送一个WM_CLOSE消息
2.如果不处理WM_CLOSE消息,DefWindowProc会默认调用DestroyWindow来发送WM_DESTROY消息
3.接收到WM_DESTROY消息后,调用PostQuitMessage发送WM_QUIT消息
4.CWinApp::Run收到WM_QUIT后结束内部消息循环,并调用ExinInstance函数,它是CWinApp的一个虚拟函数,可以由用户重载。
5.最后回到AfxWinMain,执行AfxWinTerm,结束程序。
了解WM_SYSCOMMAND消息
从窗口系统菜单上发送该消息,实现窗口的最大化,最小化,移动,还原,移动等操作
假设在CWnd派生类中
如,关闭窗口SC_CLOSE
SendMessage(WM_SYSCOMMAND, SC_CLOSE, NULL);
最小化窗口SC_MINIMIZE
SendMessage(WM_SYSCOMMAND, SC_MINIMIZE, NULL);
窗口移动状态SC_MOVE
SendMessage(WM_SYSCOMMAND, SC_MOVE, NULL);
实例应用:
我们了解了以上两种关闭窗体的流程以后,可以进行实际的应用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
//系统命令 void C...Dlg::OnSysCommand( UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else if (nID == SC_CLOSE) //关闭按钮 { //用户确认关闭窗体 if (IDYES == MessageBox(NULL, "确认关闭" + fileNameChinese + "更新程序?" , "提示" ,MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL)) { //退出应用程序 ::SendMessage(AfxGetMainWnd()->m_hWnd,WM_CLOSE,0,0); } } else if (nID == SC_MINIMIZE) //最小化,把他隐藏起来 { this ->ShowWindow(SW_HIDE); } else { CDialog::OnSysCommand(nID, lParam); } } |
这样写我们就拦截了系统消息WM_SYSCOMMAND, 从而控制关闭按钮是否发送WM_COLSE消息。
就可以使用 ::SendMessage(hWnd,WM_CLOSE,0,0); 关闭窗体啦!