MFC 对话框的创建和销毁流程

首先是模态对话框1.创建(资源,类等不谈它)A情况:在View类头文件中创建为成员变量。B情况:在View类的成员变量中临时创建。2.销毁点击OK按钮之后,程序响应响应O... 首先是 模态对话框
1.创建 (资源,类等不谈它)
A情况:在View类头文件中创建为成员变量。
B情况: 在View类的成员变量中临时创建。
2.销毁
点击OK按钮之后,程序响应响应OnOK消息,OnOK函数关闭对话框,并返回一个值IDOK给DoModal(),然后DoModal()开始返回IDOK,并把IDOK传递给EndDialog().

这里我就奇了怪了,OnOK函数已经关闭了对话框,EndDialog()现在怎么又来关闭一次对话框?

还有,对与A情况,对话框关闭后销毁了么?如果销毁,下次再DoModal()岂不是会出错?

然后是 非模态对话框,这个我倒是清楚,为了对照,我也写一下流程。

1.创建
使用 CDialog::Create()创建。(创建在堆上还是成员变量上这个不去谈它)
2.销毁
点击OK按钮之后,程序响应响应OnOK消息,OnOK函数使用EndDialog()关闭对话框,并返回一个值IDOK,并不销毁窗口,所以我们需要重写OnOK函数在其内部DestroyWindow(有需要的话)。
展开
 我来答
Idealsoft
推荐于2016-08-16 · TA获得超过639个赞
知道小有建树答主
回答量:461
采纳率:0%
帮助的人:293万
展开全部
1. EndDialog()是CDialog中的一个成员函数,OnOK其实最后也是调用了它,而在EndDialog()这个函数中,MFC又调用了WIN API中的全局函数::EndDialog(m_hWnd, ONOK)。

2. 其实这个比较生僻的地方。我们知道MFC是封装了WINDOWS API的,其实CDialog这个类并没有能力自己去创建一个窗口,而必须通过调用API去创建然后把它的句柄保存起来,以备管理。从而当一个CDialog所管理的窗口被关闭之后,CDialog本身依然存在,只不过它引用的句柄已经失效了。而我们知道DoModal这个函数是用来创建并关联窗口的,所以你说的情况不会存在。
ziguowen
2009-03-22 · TA获得超过2723个赞
知道小有建树答主
回答量:785
采纳率:35%
帮助的人:352万
展开全部
定义一个对话框类的对象,CMyDilog m_dilog;

m_dilog.DoModal()创建模态对话框。

IDOK只是确定是选择了ok值,对话框不显示了,但是m_dilog的生命期并没有结束,只要有m_dilog,下次再DoModal()为何不可? EndDialog()后对象的生命期才结束。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
何处淬吴钩
2009-03-22 · TA获得超过5045个赞
知道大有可为答主
回答量:2947
采纳率:50%
帮助的人:2430万
展开全部
这里我就奇了怪了,OnOK函数已经关闭了对话框,EndDialog()现在怎么又来关闭一次对话框?
OnOk所谓的关闭对话框,也是通过EndDialog(),这里是表述的问题。

还有,对与A情况,对话框关闭后销毁了么?如果销毁,下次再DoModal()岂不是会出错?
销毁的是对话框窗口(也是对象)。而对话框对象并未被销毁,仍然可以继续创建对话框窗口,包括模态和非模态。
应该注意,对话框对象与对话框窗口对象不能划等号。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式