非模式对话框关闭时,为什么不调用OnDestroy?

xuyunqq 2005-07-01 12:26:28
我建立了一个非模式对话框,但最后关闭的时候,如果关闭窗口的时候,它会调用OnClose().而不会调用OnDestroy(),最后在关闭程序的时候,调试信息会有这么一句:
Warning: calling DestroyWindow in CDialog::~CDialog --
OnDestroy or PostNcDestroy in derived class will not be called.


程序如下:
我在Device类中,定义了一个成员变量CDlgInfo dlgInfo;
然后在Device的构造函数里执行了一下语句:
dlgInfo.Create(IDD_INFO,(CMainFrame*)pParent);
dlgInfo.ShowWindow(SW_SHOW);
...全文
1095 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuyunqq 2005-07-01
  • 打赏
  • 举报
回复
那么,这个对话框的OnDestory函数始终不会执行喽?此外现在我对话框上右上角一个关闭按钮,其它什么也没有,那么关闭这个按钮之后会调用什么函数吗(OnOK或OnCancel之类的)
lonkil 2005-07-01
  • 打赏
  • 举报
回复
非模态对话框是要自已加入DestroyWindow的。
Badend 2005-07-01
  • 打赏
  • 举报
回复
覆盖OnOk函数 并发出PostQuitMessage即可。
xiaoqiqixiao 2005-07-01
  • 打赏
  • 举报
回复
必须调用CWnd::DestroyWindow而不是CDialog:: EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和 CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用 DestroyWindow来关闭对话框。
xuyunqq 2005-07-01
  • 打赏
  • 举报
回复
大家帮帮忙啊,急呢
umbrella1984 2005-07-01
  • 打赏
  • 举报
回复
OnDestroy不用重载的,只要在退出函数OnOK或OnCancel里调DestroyWindow函数就可以了
devang 2005-07-01
  • 打赏
  • 举报
回复
void CSetup::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
m_pParent->SendMessage(WM_SETUP_DELETE);
delete this;
CDialog::PostNcDestroy();
}
devang 2005-07-01
  • 打赏
  • 举报
回复
按 goodboyws(深夜不眠者) 说的就是了,,好像是不用重载OnDestroy()
devang 2005-07-01
  • 打赏
  • 举报
回复
对话框类中重载 OnDestroy()然后在OnOk(), 和 OnCancel() 中调用 DestroyWindow();

CXXXDlg *dlg;
dlg->Create(ID);
dlg->ShowWindow (SW_SHOW);
Robinhoodgood 2005-07-01
  • 打赏
  • 举报
回复
建议搂住查一下 无模式对话框的 用法

你的用法很不标准,哪有在 构造函数里用 Create的
万一失败,很麻烦的!
goodboyws 2005-07-01
  • 打赏
  • 举报
回复
你要重载的是OnCancel,不是DestroyWindow!!!
xxx.h
...
virtual afx_msg void OnCancel();
...

xxx.cpp
void CXXXDlg::OnCancel()
{
DestroyWindow();
}
pinel 2005-07-01
  • 打赏
  • 举报
回复
模式和无模式对话框的终止不一样:模式对话框通过调用CDialog::EndDialog;无模式则调用CWnd::DestoryWindow。函数CDialog::OnOK和OnCancel中调用DestoryWindow.

其次,需要正确删除表示对话框的对象。无模式对话框需要重载CWnd::PostNcDestroy并删除this指针
void CSampleDialog::PostNcDestory()
{
delete this;
}
AgedBOY 2005-07-01
  • 打赏
  • 举报
回复
楼主,他们回答的重点在于“OnDestroy”这个函数,需要你自己通过显式的调用DestroyWindow来使得系统调用它。Modeless对话框的OnDestroy不像DoModel的那样,会被EndDialog自动调用,需要你自己来通过DestroyWindow辗转的调用。问题不在于重不重载它。
xiaoqiqixiao 2005-07-01
  • 打赏
  • 举报
回复
是重载OnOK或OnCancel,右上角应该是OnClose()吧,正在研究中,在里面调用DestroyWindow,而不是重载DestroyWindow
xuyunqq 2005-07-01
  • 打赏
  • 举报
回复
to: vcmute(横秋)

OnSysCommand SC_CLOSE
什么意思啊,可否说得详细点
vcmute 2005-07-01
  • 打赏
  • 举报
回复
OnSysCommand SC_CLOSE
xuyunqq 2005-07-01
  • 打赏
  • 举报
回复
我重载了DestroyWindow,为什么它还不执行,并且警告信息还存在呢

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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