1. EndDialog()是CDialog中的一个成员函数,OnOK其实最后也是调用了它,而在EndDialog()这个函数中,MFC又调用了WIN API中的全局函数::EndDialog(m_hWnd, ONOK)。
2. 其实这个比较生僻的地方。我们知道MFC是封装了WINDOWS API的,其实CDialog这个类并没有能力自己去创建一个窗口,而必须通过调用API去创建然后把它的句柄保存起来,以备管理。从而当一个CDialog所管理的窗口被关闭之后,CDialog本身依然存在,只不过它引用的句柄已经失效了。而我们知道DoModal这个函数是用来创建并关联窗口的,所以你说的情况不会存在。
定义一个对话框类的对象,CMyDilog m_dilog;
m_dilog.DoModal()创建模态对话框。
IDOK只是确定是选择了ok值,对话框不显示了,但是m_dilog的生命期并没有结束,只要有m_dilog,下次再DoModal()为何不可? EndDialog()后对象的生命期才结束。
这里我就奇了怪了,OnOK函数已经关闭了对话框,EndDialog()现在怎么又来关闭一次对话框?
OnOk所谓的关闭对话框,也是通过EndDialog(),这里是表述的问题。
还有,对与A情况,对话框关闭后销毁了么?如果销毁,下次再DoModal()岂不是会出错?
销毁的是对话框窗口(也是对象)。而对话框对象并未被销毁,仍然可以继续创建对话框窗口,包括模态和非模态。
应该注意,对话框对象与对话框窗口对象不能划等号。