赞助

MFC 模式对话框、非模式对话框关闭过程

转载: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并重置无模式对话的函数

posted @ 2020-07-30 23:25  车臣  阅读(1176)  评论(0编辑  收藏  举报