转载:https://www.cnblogs.com/lidabo/archive/2012/07/04/2576590.html
工作中没有小事:点石成金,滴水成河,只有认真对待自己所做的一切事情,才能克服万难,取得成功。
因为最近一直援助一个项目,没怎么接触新的东西,但在改问题的过程中对于一些基础的东西认识更深了,在此记录一下,这是借鉴别人的成果,但实际项目中体会到的用法。
简单梳理一下窗口关闭流程:
(1)用户点击"X"关闭窗口,触发WM_CLOSE消息响应OnClose()函数
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象
(3)在DestroyWindow()中发送了WM_DESTROY消息窗口销毁后响应OnDestroy()
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUIT消息,结束消息循环
OnOK()、OnCancel()()、OnClose()、OnDestroy()各自做了什么工作:
CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用CDialog::EndDialog关闭对话框;
CDialog::OnCancel只调用CDialog::EndDialog关闭对话框;
OnClose()是响应 WM_CLOSE 的.一定程度上可以说CDialog::EndDialog()和OnClose()完成类似的工作,但处理的机制不一样,前者是CDialog的对象机制,后者是WM的消息映射机制。
CDialog::EndDialog()-------->OnDestroy()
OnClose()-------->OnDestroy()
cDialog::onok(),enddialog(),destroywindow区别
模式和无模式对话的中止是不一样的:
模式对话通过调用CDialog : : EndDialog 来中止;
非模式对话则是调用CWnd: : DestroyWindow来中止的,
函数CDialog : : OnOK和CDialog : : OnCancel调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数