标题很傻,请大家见谅!
今天学习了一下对话框的关闭,msdn说模态对话框和非模态对话框的退出过程是不一样的;
模态对话框用EndDialog()就可以了;
而非模态对话框不能用EndDialog(),需要重写onok()/oncancel()函数,屏蔽基类的部分,并调用destroywindow();不知道我理解的对不对,大拿们帮忙看看~,因为我不想响应键盘上的ESC和enter键,就重写了onok和oncancel函数,而在onclose里调用的destroywindow();
void CSerialPortDlgDlg::OnClose() 
{
// TODO: Add your message handler code here and/or call default
EndDialog(IDCANCEL);
CDialog::OnClose();
}void CSerialPortDlgDlg::OnClose() 
{
// TODO: Add your message handler code here and/or call default
DestroyWindow();
CDialog::OnClose();
}在我的程序里,两种方式都能实现退出(其实我也不太清楚程序到底有没有真的退出,对象有没有真的释放,但是任务管理器里确实都没有进程了);上网查了一下,也没整明白。有以下几个问题:1:如题:2:关闭模态对话框时,EndDialog()到底做了什么?因为msdn上说EndDialog()并没有立即关闭对话框,只是设置一个标记,等到消息处理返回时就关闭对话框,那么关闭对话框的工作是由谁做的呢?我试着重载DestroyWindow函数并跟踪到DestroyWindow,如果是DestroyWindow做的话,EndDialog有什么用了,模态和非模态都调用DestroyWindow不可以吗?3:代码中的CDialog::OnClose在我屏蔽前后没什么不同,在SRC源码也没找到CDialog::OnClose()的执行情况,那么CDialog::OnClose()做了什么?msdn说CWnd::OnClose默认执行调用DestroyWindow。我想CDialog::OnClose()是不是屏蔽了cwnd的部分,默认调用OnCancel(),然后其他什么都没做了吗?4:msdn说DestroyWindow并不销毁窗口对象,只是销毁与窗口对象相关的“可视”的窗口,对象清理工作可在PostNcDestroy ()中完成;可是我并没有这么做,因为我在网上看有些窗口有自动清理功能,基于对话框的应用程序算吧?那么其他的没有自动清理功能的窗口有哪些?5:应用程序(包括基于对话框和基于文档的)在DestroyWindow过程中PostQuitMessage是必须的吗?因为我见的大部分程序都没这么处理。问题有点多,请高手赐教~

解决方案 »

  1.   

    1、模态还是非模态要看调用方法,DoModal调用就是模态,通过Create对话框然后ShowWindows就是非模态
    2、模态调用时DoModal有一个返回值, EndDialog的传入参数就是设置这个返回值
    3、OnClose在模态和非模态调用时产生的效果不一样,一般模态调用OnClose的功能是通过OnCanel实现的,而非模态调用通常就是隐藏窗口
    4、窗口是自动清理,也就是在PostNcDestroy中delete this,但对话框不是
    5、MFC框架下已经做了封装,不建议自行调用PostQuitMessage
      

  2.   


    1:那mfc框架下基于对话框的应用程序的“对话框”创建时调用的是DoModal还是Create?
    2:EndDialog是不是可以理解为封装了DestroyWindow,只是有了一个返回值。如果是这样的话,那么假设我不想删除非模态对话框对象,而只是销毁窗口,那么调用EndDialog在理论上和DestroyWindow效果一样吧?即使如果想删除对象,由于EndDialog调用了DestroyWindow,所以还可以在PostNcDestroy里delete吧。(DestroyWindow非模态对话框后,由于只是销毁了窗口,那么想再次显示应该怎么做?或者说有没有可能再显示。我知道一般情况下想下次接着用的话,隐藏窗口就行了,这里我想知道DestroyWindow后还有没有可能恢复窗口)
    4:如果对话框程序不是自动删除类,那还得手动在PostNcDestroy中delete this了?因为基于对话框应用程序也是MFC构架的,我就想当然认为框架为自动delete this了。
      

  3.   

    1、DoModal
    2、没明白你什么意思,EndDialog没有销毁对象
    4、模态不需要delete this