LiangWang的个人博客分享 http://blog.sciencenet.cn/u/LiangWang

博文

[转载]10.OnOK()、OnCancel()、OnClose()、OnDestroy()详解

已有 1141 次阅读 2019-8-16 16:09 |个人分类:coding|系统分类:科研笔记|文章来源:转载

第一,OnOK()和OnCancel()是CDialog基类的成员函数,而OnClose()和OnDestroy()是CWnd基类的成员函数, 即WM消息响应函数。   从应用程序结构的角度,拿对话框来说,红色的X对应的是CWnd,而处于对话框中的“确定”、“取消”按钮则对应了CDialog。

第二,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_QUIT消息,结束消息循环
            可以看到,程序的退出过程,是先响应OnClose(),然后响应OnDestroy(),在响应OnDestroy()之前,

            窗口对象已经被销毁。OnDestroy()到底干了什么呢?它就像一个teller,先通知CWnd对象告诉它即将被销毁,

            尔后OnDestroy的真正运行是在CWnd对象已经从屏幕上清除以后被调用的。

第三,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()
            EndDialog()和OnClose()属于“同级别”的,所以我们在按下OK按钮的时候,程序是不会执行OnClose()的,

            但两种机制都必须经过OnDestroy()。

转载地址:https://blog.csdn.net/masibuaa/article/details/7783780




http://blog.sciencenet.cn/blog-3392538-1193882.html

上一篇:09.MATLAB 如何将一个完整的文件名分割为:路径,文件名,扩展名和版本号
下一篇:[转载]11转载靠谱的论文下载方法

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2021-10-21 15:22

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部