MFC中关闭非模式窗口
2009-02-26 11:31
302 查看
今天遇到了这么一个问题--在关闭对话框之后重新打开时,程序崩溃。开始的时候没注意这是
一个非模式对话框,而非模式对话框时要求用户自己关闭和销毁。而且必须调用CWnd::DestroyWindow而不是Dialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数
并且在函数中调用DestroyWindow来关闭对话框。或者是截获对话框的关闭消息WM_CLOSE,在消息响应函数中来调用DestroyWindow函数。消息响应的顺序是:
首先响应WM_CLOSE,调用DestroyWindow(),
DestroyWindow()又发送WM_DESTROY,
响应WM_DESTROY,调用WM_QUIT,
GetMessage()发现WM_QUIT,退出程序。
下面介绍下三个关闭消息:
WM_CLOSE:
在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮,你的窗口过程就会收到WM_CLOSE。DefWindowProc对WM_CLOSE的处理是调用DestroyWindow。当然,你可以不让DefWindowProc处理,而是自己处理,例如询问用户是否保存更改等。如果用户选择“取消”,
你忽略此消息,那么程序照常运行;如果用户确认要退出,你就调用DestroyWindow。
WM_DESTROY:
接下来,DestroyWindow完成窗口的清理工作,最后像窗口过程发送WM_DESTROY。对于 WM_DESTROY,DefWindowProc不会处理。也就是说,你如果不处理这个消息,虽然你的窗口
已经销毁,但进程并不会结束。一般处理 WM_DESTROY时都是释放资源(例如申请的内存等),
然后调用PostQuitMessage。
WM_QUIT:
PostQuitMessage会发送WM_QUIT给消息队列。注意,WM_QUIT永远不会到达窗口过程,
因为GetMessage得到WM_QUIT后就会返回FALSE,从而结束消息循环,最后进程结束,程序退出。
假设使用者执行HELLOWIN,并且使用者最终单击了 Close按钮,或者假设用键盘或鼠标从系统菜单中选择了Close,DefWindowProc处理这一键盘或者鼠标输入,在检测到使用者选择了Close选项之后,它给窗口消息处理程序发送一条WM_SYSCOMMAND消息。WndProc将这个消息
传给DefWindowProc。 DefWindowProc给窗口消息处理程序发送一条WM_CLOSE消息来响应之。WndProc再次将它传给DefWindowProc。 DestroyWindow呼叫DestroyWindow来响应这条WM_CLOSE消息。DestroyWindow导致Windows给窗口消息处理程序发送一条WM_DESTROY消息。WndProc再呼叫PostQuitMessage,将一条WM_QUIT消息放入消息队列中,以此来响应此消息。这个消息导致WinMain中的消息循环终止,然后程序结束。
函数DestroyWindow声明如下:
WINUSERAPI BOOL WINAPI DestroyWindow(__in HWND hWnd);
hWnd是要删除的窗口句柄。
注:使用DialgBox建立的对话框是“模式对话框”,只有关闭对话框后,程序的其他窗口才能进行
操作。与此相对应,存在“非模式对话框”,对话框建立后,并不强制要求用户立即反应,而是与其他窗口同时接受用户操作。
一个非模式对话框,而非模式对话框时要求用户自己关闭和销毁。而且必须调用CWnd::DestroyWindow而不是Dialog::EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数
并且在函数中调用DestroyWindow来关闭对话框。或者是截获对话框的关闭消息WM_CLOSE,在消息响应函数中来调用DestroyWindow函数。消息响应的顺序是:
首先响应WM_CLOSE,调用DestroyWindow(),
DestroyWindow()又发送WM_DESTROY,
响应WM_DESTROY,调用WM_QUIT,
GetMessage()发现WM_QUIT,退出程序。
下面介绍下三个关闭消息:
WM_CLOSE:
在系统菜单里选择了“关闭”或者点击了窗口右上角的“X”按钮,你的窗口过程就会收到WM_CLOSE。DefWindowProc对WM_CLOSE的处理是调用DestroyWindow。当然,你可以不让DefWindowProc处理,而是自己处理,例如询问用户是否保存更改等。如果用户选择“取消”,
你忽略此消息,那么程序照常运行;如果用户确认要退出,你就调用DestroyWindow。
WM_DESTROY:
接下来,DestroyWindow完成窗口的清理工作,最后像窗口过程发送WM_DESTROY。对于 WM_DESTROY,DefWindowProc不会处理。也就是说,你如果不处理这个消息,虽然你的窗口
已经销毁,但进程并不会结束。一般处理 WM_DESTROY时都是释放资源(例如申请的内存等),
然后调用PostQuitMessage。
WM_QUIT:
PostQuitMessage会发送WM_QUIT给消息队列。注意,WM_QUIT永远不会到达窗口过程,
因为GetMessage得到WM_QUIT后就会返回FALSE,从而结束消息循环,最后进程结束,程序退出。
假设使用者执行HELLOWIN,并且使用者最终单击了 Close按钮,或者假设用键盘或鼠标从系统菜单中选择了Close,DefWindowProc处理这一键盘或者鼠标输入,在检测到使用者选择了Close选项之后,它给窗口消息处理程序发送一条WM_SYSCOMMAND消息。WndProc将这个消息
传给DefWindowProc。 DefWindowProc给窗口消息处理程序发送一条WM_CLOSE消息来响应之。WndProc再次将它传给DefWindowProc。 DestroyWindow呼叫DestroyWindow来响应这条WM_CLOSE消息。DestroyWindow导致Windows给窗口消息处理程序发送一条WM_DESTROY消息。WndProc再呼叫PostQuitMessage,将一条WM_QUIT消息放入消息队列中,以此来响应此消息。这个消息导致WinMain中的消息循环终止,然后程序结束。
函数DestroyWindow声明如下:
WINUSERAPI BOOL WINAPI DestroyWindow(__in HWND hWnd);
hWnd是要删除的窗口句柄。
注:使用DialgBox建立的对话框是“模式对话框”,只有关闭对话框后,程序的其他窗口才能进行
操作。与此相对应,存在“非模式对话框”,对话框建立后,并不强制要求用户立即反应,而是与其他窗口同时接受用户操作。
相关文章推荐
- MFC回车后关闭窗口
- 【旧资料整理】MFC--实现在程序启动画面关闭后再显示窗口
- 屏蔽MFC程序中的ESC键和ENTER键关闭窗口
- MFC中按下Button按钮,弹出一个窗口的同时关闭本窗口
- [MFC]解决回车键默认关闭窗口的一般方法
- MFC关闭窗口 退出软件的 用法
- MFC 窗口关闭过程
- MFC给子窗口添加图标和子窗口自动关闭
- [MFC]解决回车键 ESC 默认关闭窗口的一般方法
- MFC关闭进程和更改已知标题窗口的标题
- MFC 关闭所有弹出模态对话框,并创建新的对话框(切换/跳转窗口)
- 如何让MFC程序关闭按钮失效,也无法右击任务栏关闭窗口来关闭?
- MFC中如何自定义点击关闭窗口的操作
- MFC(10)解决回车键 ESC 默认关闭窗口的一般方法
- MFC中关闭窗口时发生错误的原因
- MFC 在子线程中关闭主线程窗口
- MFC窗口不能正常关闭
- MFC应用程序中处理消息的顺序 MFC应用程序创建窗口的过程 关闭窗口的顺序(非模态窗口) ..................
- MFC应用程序中处理消息,创建窗口的过程,关闭窗口(非模态窗口),打开模式对话框等的函数调用顺序 .
- 屏蔽基于对话框的MFC程序中按下ESC关闭窗口的功能