zoukankan      html  css  js  c++  java
  • MFC OnOk(),OnCancel(),OnClose(),OnDestroy()的区别总结(转)

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

    OnOK进行默认的存贮工作后退出 
    OnCancel不进行存贮工作后退出 
    OnOk可将对话框中的值赋给对应的变量 
    OnCancel只消毁对话框 

    一般OnOK的调用是由于单击了ID为IDOK的按钮激发的,此时需要重载该函数, 
    如果对话框包含数据验证、数据交换,会激发DoDataExchange()函数更新 
    应用程序中对应的变量值,然后销毁相应的对话框 
    OnCancel的调用是由于单击了ID为IDCANCEL的按钮或者按了Esc激发的, 
    它仅仅销毁相应的对话框,不更新数据。

  • 相关阅读:
    【SpringMVC】SpringMVC系列15之SpringMVC最佳实践
    【SpringMVC】SpringMVC系列14之SpringMVC国际化
    could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin:2.5 or one of(maven报错)
    ubuntu14安装tensorflow并测试
    HTMLajax跨域向服务器写入数据
    eclipse的最新版本luna的中建立svn和maven
    关于equals与hashcode的重写
    会计中的冲销和红票
    dubbo在项目中的应用
    dubbo介绍以及创建
  • 原文地址:https://www.cnblogs.com/onwayo/p/3484902.html
Copyright © 2011-2022 走看看