总结OnOK、OnCancel、OnDestroy函数之间的区别

第一,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()

猜你喜欢

转载自blog.csdn.net/hitarcher/article/details/80667544