我建立了一个非模式对话框,但最后关闭的时候,如果关闭窗口的时候,它会调用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);

解决方案 »

  1.   

    必须调用CWnd::DestroyWindow而不是CDialog:: EndDialog来关闭非模态对话框。调用CWnd::DestroyWindow是直接删除窗口的一般方法。由于缺省的CDialog::OnOK和 CDialog::OnCancel函数均调用EndDialog,故程序员必须编写自己的OnOK和OnCancel函数并且在函数中调用 DestroyWindow来关闭对话框。
      

  2.   

    覆盖OnOk函数 并发出PostQuitMessage即可。
      

  3.   

    非模态对话框是要自已加入DestroyWindow的。
      

  4.   

    那么,这个对话框的OnDestory函数始终不会执行喽?此外现在我对话框上右上角一个关闭按钮,其它什么也没有,那么关闭这个按钮之后会调用什么函数吗(OnOK或OnCancel之类的)
      

  5.   

    我重载了DestroyWindow,为什么它还不执行,并且警告信息还存在呢
      

  6.   

    to: vcmute(横秋) OnSysCommand SC_CLOSE
    什么意思啊,可否说得详细点
      

  7.   

    是重载OnOK或OnCancel,右上角应该是OnClose()吧,正在研究中,在里面调用DestroyWindow,而不是重载DestroyWindow
      

  8.   

    楼主,他们回答的重点在于“OnDestroy”这个函数,需要你自己通过显式的调用DestroyWindow来使得系统调用它。Modeless对话框的OnDestroy不像DoModel的那样,会被EndDialog自动调用,需要你自己来通过DestroyWindow辗转的调用。问题不在于重不重载它。
      

  9.   

    模式和无模式对话框的终止不一样:模式对话框通过调用CDialog::EndDialog;无模式则调用CWnd::DestoryWindow。函数CDialog::OnOK和OnCancel中调用DestoryWindow.其次,需要正确删除表示对话框的对象。无模式对话框需要重载CWnd::PostNcDestroy并删除this指针
    void CSampleDialog::PostNcDestory()
    {
    delete this;
    }
      

  10.   

    你要重载的是OnCancel,不是DestroyWindow!!!
    xxx.h
    ...
    virtual afx_msg void OnCancel();
    ...xxx.cpp
    void CXXXDlg::OnCancel()
    {
       DestroyWindow();
    }
      

  11.   

    建议搂住查一下 无模式对话框的 用法你的用法很不标准,哪有在 构造函数里用 Create的
    万一失败,很麻烦的!
      

  12.   

    对话框类中重载 OnDestroy()然后在OnOk(), 和 OnCancel() 中调用 DestroyWindow();CXXXDlg *dlg;
    dlg->Create(ID);
    dlg->ShowWindow (SW_SHOW);
      

  13.   

    按 goodboyws(深夜不眠者) 说的就是了,,好像是不用重载OnDestroy()
      

  14.   

    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();
    }
      

  15.   

    OnDestroy不用重载的,只要在退出函数OnOK或OnCancel里调DestroyWindow函数就可以了