基于对话框的应用程序 这里的“对话框”是模态还是非模态的?该怎么解决

基于对话框的应用程序 这里的“对话框”是模态还是非模态的?
标题很傻,请大家见谅!
今天学习了一下对话框的关闭,msdn说模态对话框和非模态对话框的退出过程是不一样的;
模态对话框用EndDialog()就可以了;
而非模态对话框不能用EndDialog(),需要重写onok()/oncancel()函数,屏蔽基类的部分,并调用destroywindow();

不知道我理解的对不对,大拿们帮忙看看~,因为我不想响应键盘上的ESC和enter键,就重写了onok和oncancel函数,而在onclose里调用的destroywindow();
C/C++ code
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、模态还是非模态要看调用方法,DoModal调用就是模态,通过Create对话框然后ShowWindows就是非模态
2、模态调用时DoModal有一个返回值, EndDialog的传入参数就是设置这个返回值
3、OnClose在模态和非模态调用时产生的效果不一样,一般模态调用OnClose的功能是通过OnCanel实现的,而非模态调用通常就是隐藏窗口
4、窗口是自动清理,也就是在PostNcDestroy中delete this,但对话框不是
5、MFC框架下已经做了封装,不建议自行调用PostQuitMessage
------解决方案--------------------
探讨

引用:

1、模态还是非模态要看调用方法,DoModal调用就是模态,通过Create对话框然后ShowWindows就是非模态
2、模态调用时DoModal有一个返回值, EndDialog的传入参数就是设置这个返回值
3、OnClose在模态和非模态调用时产生的效果不一样,一般模态调用OnClose的功能是通过OnCanel实现的,而非模态调用通常就是隐藏窗口
4……