第一,OnOk()和OnCancel()是CDialog基类的成员函数,即ID为ID_OK和ID_CANCEL的按钮的通知消息的响应函数,而OnClose()和OnDestroy()是CWnd基类的成员函数,即WM消息响应函数
第二,OnClose()和OnDestroy()
在对话框程序中,根据《深入浅出MFC》所讲,程序退出执行时执行的操作顺序为(从点X按钮开始)
(1)用户点击X关闭按钮,发送了WM_CLOSE消息----------->响应OnClose()
(2)在WM_CLOSE消息的处理函数中,调用DestroyWindow()--------->销毁与指定CWnd对象关联的窗口,但没有销毁CWnd对象
(3)在DestroyWindow()中发送了WM_DESTROY消息----------->窗口销毁后响应OnDestroy();
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUITT消息,结束消息循环
可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy()。OnDestroy中调用PostQuitMessage()发送WM_QUIT消息结束消息循环。
如果没有重定义OnClose函数的话
在对话框程序中,
1)用户点击X关闭按钮,调用的是CDialog::OnCancel函数
(2)在CDialog::OnCancel的处理函数中,调用CDialog::EndDialog关闭对话框;销毁与指定CDialog对象关联的对话框,但没有销毁CDialog对象
(3)在CDialog::EndDialog中发送了WM_DESTROY消息----------->窗口销毁后响应OnDestroy();
(4)在WM_DESTROY消息中调用PostQuitMessage(),发送WM_QUITT消息,结束消息循环
可以看到,程序的退出过程,是先响应OnCancel(),然后响应OnDestroy()。OnDestroy中调用PostQuitMessage()发送WM_QUIT消息结束消息循环。
第三,OnOk(),OnCancel(),OnClose(),OnDestroy()
CDialog::OnOk首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用CDialog::EndDialog()关闭对话框;CDialog::OnCancel只调用CDialog::EndDialog关闭对话框;
OnClose()是WM_CLOSE的响应函数。在一定程度上可以说CDialog::EndDialog()和OnClose()完成类似的工作,但处理的机制不一样,前者是CDialog的对象机制,后者是WM的消息映射机制。
CDialog::EndDialog()------------>OnDestroy()
OnClose()------------>OnDestroy()
所以我们在按下cancel按钮的时候,程序不会执行OnClose(),而是调用了直接调用了CDialog::EndDialog(),然后调用了OnDestroy()