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

然后发现

下面这两种说法不明晰

(1) EndDialog(-1);
关闭模态对话框,并且将参数作为父对话框调用的返回值。
(2) DestroyWindow(); ::PostQuitMessage(0);
DestroyWindow 关闭非模态对话框。 退出消息循环,真正结束进程。有不少程序窗口关闭,但是不等于退出运行。

cDialog::onok(),enddialog(),destroywindow区别。 收藏

模式和无模式对话的中止是不一样的:模式对话通过调用CDialog : : EndDialog 来中止,无模式对话则是调用CWnd: : DestroyWindow来中止的,函数CDialog : : OnOK和CDialog : : OnCancel调用EndDialog ,所以需要调用DestroyWindow并重置无模式对话的函数。

最后三个还不错

Windows API一日一练(18)EndDialog函数 收藏
上一次介绍了怎么样显示对话框的函数,那么怎么样关闭对话框呢?这就需要使用到函数EndDialog。这个函数只能在对话框的消息处理函数里使用,并且这个函数调用之后,没有立即就删除对话框的,而是设置了 操作系统里的结束标志。当操作系统查检到有这个标志时,就去删除对话框的消息循环,同时也去释放对话框占用的资源。其实对话框的生命周期是这样的,先由函数DialogBox创建对话框,这样函数DialogBox完成创建对话框但还没有显示前会发出消息WM_INITDIALOG,让对话框有机会初始化上面所有窗口或控件的显示,比如设置文本框的字符串等。最后当用户点出确定或者取消的按钮,就收到两个命令IDOK或IDCANCEL,这时就可以调用函数EndDialog来结束对话框的生命。
函数EndDialog声明如下:
WINUSERAPI
BOOL
WINAPI
EndDialog(
__in HWND hDlg,
__in INT_PTR nResult);
hDlg是对话框窗口的句柄。
nResult是设置给函数DialogBox的返回值。
调用这个函数的例子如下:
#001 // 显示关于对话框。
#002 //
#003 // 蔡军生 2007/07/12
#004 //
#005 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
#006 {
#007 UNREFERENCED_PARAMETER(lParam);
#008 switch (message)
#009 {
#010 case WM_INITDIALOG:
#011 return (INT_PTR)TRUE;
#012
#013 case WM_COMMAND:
#014 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
#015 {
#016 EndDialog(hDlg, LOWORD(wParam));
#017 return (INT_PTR)TRUE;
#018 }
#019 break;
#020 }
#021 return (INT_PTR)FALSE;
#022 }
第16行就是调用函数EndDialog来关闭对话框。

EndDialog和CDialog::OnOK()相关推荐

  1. CDialog::OnOk()作用

    CDialog::OnOk(); 当用户点击OK按钮关闭对话框时要执行的动作(事件处理)

  2. 【MFC】CDialog类详解

    00. 目录 文章目录 00. 目录 01. 概述 02. 继承层次结构 03. 成员方法 04. 常用成员方法描述 4.1 构造函数 4.2 Create函数 4.3 DoModal函数 4.4 E ...

  3. CWnd的派生类-3、CDialog类

    对话框与普通窗口的区别仅在于,对话框是通过对话框模板建立起来的.只需要一个以模板为实参的创建命令,如CDialog::Create(),就可以完成对话框窗口及其子控件的创建工作,所有创建细节都由对话框 ...

  4. [MFC] CDialog::DoModal()函数用法

    5.2 创建有模式对话框 使用有模式对话框时在对话框弹出后调用函数不会立即返回,而是等到对话框销毁后才会返回(请注意在对话框弹出后其他窗口的消息依然会被传递).所以在使用对话框时其他窗口都不能接收用户 ...

  5. MFC 教程【12_对话框和对话框类CDialog 】

    对话框和对话框类CDialog 对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的. 模式和无模式对话框 对话框分两种类型,模式对话框和无模式对话框. 模式对 ...

  6. MFC中解决回车和ESC关闭的问题,重载OnOk(),OnCancel()函数的正确做法

    本文参考了如下文章: http://msdn.microsoft.com/en-us/library/66b3y2ab(VS.71).aspx http://topic.csdn.net/u/2010 ...

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

    第一,OnOk()和OnCancel()是CDialog基类的成员函数,即ID为ID_OK和ID_CANCEL的按钮的通知消息的响应函数,而OnClose()和OnDestroy()是CWnd基类的成 ...

  8. OnOK()与OnCancel()

    点击打开链接 首先OnOK是对ID_OK的响应, OnCancel是对IDCANCEL的响应. 前者对应键盘的Enter, 后者对应Esc. MFC: 1.Called when the user c ...

  9. 深入理解OnOK与OnCancel

    这几天调一个程序时,遇到一个和OnOK, OnCancel有关的bug, 于是整理一下写了下面这篇文章. 首先OnOK是对ID_OK的响应, OnCancel是对IDCANCEL的响应. 前者对应键盘 ...

最新文章

  1. 2018/12/08 L1-045 宇宙无敌大招呼 java
  2. Django 在test.py 中测试文件的配置
  3. 服务器升级中不能修改,windows10下更新服务器为何改不了了
  4. android 短信编解码方式,中移短信cmpp协议/smpp协议 netty实现编解码
  5. [Linux]文件的atime ctime mtime
  6. HDOJ/HDU 2555 人人都能参加第30届校田径运动会了(判断加排序~)
  7. android字符串点击事件,Android匹配字符串高亮并设置点击事件
  8. 循环语句—C#基础回顾
  9. sql python r_Mode Studio,支持Python,R和SQL的云数据分析利器
  10. IMDB 2003.07.12 最新排名
  11. 利用QGIS免费批量获取Google、Bing等高分辨率卫星影像
  12. Ureport2源码启动
  13. niosii 把程序固化到epcs中的步骤
  14. MATLAB 中gcf、gca 以及gco 的区别
  15. ubuntu安装mysql失败了,为啥嘞
  16. cycJava基础以及集合总结
  17. Mockplus默认图标导出的方法
  18. CLI 什么是 command-line interface
  19. 【JavaScript 笔记】基础内容
  20. R: RStudio的中文读取、保存与显示

热门文章

  1. codeblock 带mingw的版本_云顶之弈10.22新版本最强阵容排名 10.22版本吃鸡阵容推荐...
  2. java线程池深入讲解_死磕 java线程系列之线程池深入解析——生命周期
  3. 英文期刊论文写作工具入门
  4. mysql五种日期函数
  5. 【Jenkins】通过ANT构建JMeter任务时提示找不到jtl文件时的解决方法
  6. android HDMI 清晰度 分辨率
  7. ERP 我最看重什么?
  8. 谷歌否认街景服务侵犯隐私
  9. 京东2019春招Java工程师编程题题解
  10. hdu 527 Necklace