总结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()

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值