MFC 非模态对话框销毁的问题 求指导

云端轻尘 2013-11-28 09:43:13
大家好,我刚学MFC不久, 在看模态对话框和非模态对话框的问题,
我有一个疑问,就是关于MSDN中解释的这段话
引用
非模态对话框需要重载函数OnCanel,并且在这个函数中调用DestroyWindow。并且不能调用基类的OnCancel,因为基类的OnCancel调用了EndDialog这个函数,这个函数是针对模态对话框的。

我想问的是EndDialog是结束一个模态对话框 ,那么基类的OnCancel还调用了什么其他函数?因为如果不重载函数OnCanel,当我触发这个函数时,窗体就消失了,当然我想只是被隐藏了,没有被销毁.....难道基类的OnCancel还会执行ShowWindow(SW_HIDE),这样的功能???
...全文
268 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanyufeng_521 2013-11-30
  • 打赏
  • 举报
回复
学习了,了解了
worldy 2013-11-28
  • 打赏
  • 举报
回复
不是说的很清楚了? 基类的OnCancel调用EndDialog,这个函数是用于销毁模态对话框的
SKATE11 2013-11-28
  • 打赏
  • 举报
回复
内部应该都是向窗口发送窗口销毁消息
赵4老师 2013-11-28
  • 打赏
  • 举报
回复
请帖主移驾VC/MFC论坛。
昨夜无风 2013-11-28
  • 打赏
  • 举报
回复
没有找到EndDialog( _In_ HWND hDlg,_In_ INT_PTR nResult)的实现代码,好像被封装起来了,下面是别人解释的! Calling EndDialog on modeless dialogs For clarity, EndDialog should not be called on a dialog created via CreateDialog, because while the call will appear to have succeeded, it really only hides the window (the window handle still exists). Instead, explicitly call DestroyWindow.
Eleven 2013-11-28
  • 打赏
  • 举报
回复
MSDN上不是讲的很清楚吗? When you implement a modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don't call the base class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but will not destroy it. You should also override PostNcDestroy for modeless dialog boxes in order to delete this, since modeless dialog boxes are usually allocated with new. Modal dialog boxes are usually constructed on the frame and do not need PostNcDestroy cleanup.
云端轻尘 2013-11-28
  • 打赏
  • 举报
回复
引用 6 楼 sd_sunlang 的回复:
[quote=引用 5 楼 sd_sunlang 的回复:] 如果在非模态对话框中实现Cancel按钮,必须覆盖OnCancel成员函数,并在其中调用DestoryWindow。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。
EndDialog是不会销毁资源的,它会结束模态对话框的消息循环,而模态的销毁是DoModle发起的[/quote] 对,正式由于EndDialog是不会销毁资源的,它会结束模态对话框的消息循环,那么,为什么我点取消的时候窗体变成不可视了?
云端轻尘 2013-11-28
  • 打赏
  • 举报
回复
引用 5 楼 sd_sunlang 的回复:
如果在非模态对话框中实现Cancel按钮,必须覆盖OnCancel成员函数,并在其中调用DestoryWindow。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。
你这自己都说了,那将使对话框虽然存在但不可视,我想要问的就是 是什么原因 让对话框 不可视
云端轻尘 2013-11-28
  • 打赏
  • 举报
回复
[/quote] EndDialog是不会销毁资源的,它会结束模态对话框的消息循环,而模态的销毁是DoModle发起的[/quote] 你说的这些我都知道, 我想要问的是什么原因让对话框不可视。。。。。。
孙郎 2013-11-28
  • 打赏
  • 举报
回复
引用 5 楼 sd_sunlang 的回复:
如果在非模态对话框中实现Cancel按钮,必须覆盖OnCancel成员函数,并在其中调用DestoryWindow。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。
EndDialog是不会销毁资源的,它会结束模态对话框的消息循环,而模态的销毁是DoModle发起的
孙郎 2013-11-28
  • 打赏
  • 举报
回复
如果在非模态对话框中实现Cancel按钮,必须覆盖OnCancel成员函数,并在其中调用DestoryWindow。不能调用基类成员函数,那将会调用EndDialog,使对话框虽然存在但不可视。
云端轻尘 2013-11-28
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
不是说的很清楚了? 基类的OnCancel调用EndDialog,这个函数是用于销毁模态对话框的
你似乎没明白我的意思,我知道基类的OnCancel调用EndDialog来销毁模态对话框,我要问的是 如果我创建的是非模态对话框,而且我没有重载OnCancel,这种情况下,我点击确定或者取消的时候,非模态对话框被隐藏了。。。所以我想知道OnCancel除了调用EndDialog外,是不是还调用了其他的函数

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧