CDilalog包含三个关键函数:OnInitDialog、OnOK和OnCancel,可以覆盖这三个函数初始化对话框、响应点击OK和Cancel按钮。尽管每个函数都响应一条对话框消息,但是不需要你提供消息映射,因为CDialog已经做了消息映射,并把它们视为一般的虚函数。CDialog还提供了这三个函数的默认实现,如果充分利用MFC的对话框数据交换机制和验证机制,就不必覆盖它们。

对话框创建后,它会收到一条WM_CREATE消息。但是 WM_CREATE到达时,对话框模板上指定的控件还没有被创建,因此,不能被初始化。对话框是空的。Windows用来处理对话框消息的内部窗口过程响 应WM_CREATE时创建对话框的控件。控件创建后,对话框收到WM_INITDIALOG消息,使得对话框有机会进行必要的初始化,包括初始化控件。 在CDialog派生类中,WM_INITDIALOG激活对话框的OnInitDialog函数,它的原型是:

  • virtual BOOL OnInitDialog ()

OnInitDialog是对话框工作前作必要准备的地方,例如:选择单选按钮或在编辑控件插入文本。该函数一被调用,对话框就存在于内存中,只是在屏幕上不可见。用户无法知道在OnInitDialog中做了什么,但是将会看到结果。

OnInitDialog的返回值告诉Windows如何处理输 入焦点。如果返回TRUE,Windows按照tab顺序使第一个控件具有输入焦点。如果想让其它控件具有输入焦点,可以在OnInitDialog中调 用控件的SetFocus函数,并返回FALSE,阻止Windows设置输入焦点。可以这样设置输入焦点:

  • GetDlgItem (IDC_EDIT)->SetFocus ();

如果覆盖了OnInitDialog,就应该调用基类的OnInitDialog函数。原因稍后讲解。

用户点击OK按钮时,对话框收到WM_COMMAND消息,报告按钮被单击,MFC就调用对话框的OnOK虚函数。为了使这种机制可以工作,必须使OK按钮的ID值等于IDOK,例如下面的资源语句:

  • DEFPUSHBUTTON "OK", IDOK, 60, 34, 40, 24, WS_GROUP

如果要在对话框关闭前进行特殊的处理,可以覆盖OnOK函数,这可能包含数据交换和数据验证。如果覆盖了OnOK,必须调用EndDialog或基类的OnOK函数销毁对话框。否则,点击OK按钮时,对话框不会消失。

点击Cancel按钮时如果要调用OnCancel,它的ID就 必须等于IDCANCEL。即使对话框中没有Cancel按钮,按下Esc键或标题栏上的关闭按钮都会调用OnCancel。通常不会覆盖 OnCancel,因为改变被取消后,无需从控件读取数据。CDialog::OnCancel使用IDCANCEL参数调用EndDialog销毁对话 框,并通知用户应该忽略控件的改变。

除了WM_INITDIALOG消息(该消息是对话框特有的),对话框接收的消息和窗口接收的消息相同。可以使用消息映射将这些消息映射到对话框类的成员函数。例如:

  • ON_BN_CLICKED (IDC_RESET,OnReset)

点击ID值等于IDC_RESET的按钮时,就会调用OnReset。

对话框甚至可以处理WM_PAINT消息。因为控件可以重画自身,多数对话框不需要OnPaint。

CDialog类的更多相关文章

  1. CDialog类中OnCancel()、OnInitDialog()作用

    1.void CCOMDDlg::OnCancel() { // TODO: Add extra cleanup here CDialog::OnCancel();} 如果把CDialog::OnCa ...

  2. MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)

    前面讲了模态对话框和非模态对话框,本节来将一种特殊的对话框--属性页对话框. 属性页对话框的分类 属性页对话框想必大家并不陌生,XP系统中桌面右键点属性,弹出的就是属性页对话框,它通过标签切换各个页面 ...

  3. MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数. 例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDIT ...

  4. 【转】VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    原文网址:http://www.jizhuomi.com/software/153.html 前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下, ...

  5. VS2010/MFC对话框三:创建对话框类和添加控件变量

    创建对话框类和添加控件变量 前两讲中讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 例程Addition是 ...

  6. Visual C++中最常用的类与API函数

    这篇文章能让初学者快速了解visual C++ MFC中常见的核心的类与函数,虽然全部看下来有点枯燥,但对初学者快速了解MFC的框架结构很有好处. 常用类 CArchive类:用于二进制保存档案 CB ...

  7. VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)

    前面讲了模态对话框和非模态对话框,本节开始鸡啄米讲一种特殊的对话框--属性页对话框.另外,本套教程所讲大部分对VC++各个版本均可适用或者稍作修改即可,但考虑到终究还是基于VS2010版本的,所以将& ...

  8. VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)

    前两讲中鸡啄米为大家讲解了如何创建对话框资源.创建好对话框资源后要做的就是生成对话框类了.鸡啄米再声明下,生成对话框类主要包括新建对话框类.添加控件变量和控件的消息处理函数等. 因为鸡啄米给大家的例程 ...

  9. CDialog与CDialogEx的区别联系

    CDialogEx是VS2003之后出现的,VC++6.0没有.CDialogEx = CDialog ExtendExtend的意思是扩展,即扩展的CDialog! 这个类是CDialog的扩展类, ...

随机推荐

  1. Haskell语言学习笔记(22)MaybeT

    Monad Transformers Monad 转换器用于将两个不同的Monad合成为一个Monad.Monad 转换器本身也是一个 Monad. MaybeT MaybeT 这个 Monad 转换 ...

  2. ng2-file-upload 使用记录

    最近这两周一直在修bug,修的很是痛苦,不过痛苦也是件好事,不然每天都是在做同样的事情,没有什么挑战,工作多无聊呀! 是吧. 大致说一下背景吧: 这个项目是两年前开新项目,到现在一直还在开发中,一直不 ...

  3. Spring 集成Hibernate的三种方式

    首先把hibernate的配置文件hibernate.cfg.xml放入spring的src目录下,并且为了便于测试导入了一个实体类Student.java以及它的Student.hbm.xml文件 ...

  4. vs2015安装出问题

    win7系统需要更新serverpage1包,更新完就ok了,ie不用升级到ie10

  5. .net调用web邮箱发送邮件(转载)

    public static void SendEmail() { System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient( ...

  6. 6-Linux 上mysql的常用命令 以及 tomcat的相关指定

    mysql -u root -p 进入Mysql //注意一下有逗号!!! show databases; //显示所有的数据库 drop database mydb; // 删除mydb这个数据库 ...

  7. ubuntu 操作系统的目录结构

    Ubuntu 系统的目录众多,并且 Ubuntu 系统是不分 C 盘.D 盘等的,但是所有的目录都是在/目录下面的. 一./:根目录,是所有目录的绝对路径的起始点,Ubuntu 中的所有文件和目录都在 ...

  8. uploadify 文件上传报http 302错误

    uploadify文件上传会报http 302错误,在配置文件中将处理上传的通用类取消验证, 假设上传的通用处理类是fileUpload.ashx,则在配置文件同添加下面过滤配置能解决问题. < ...

  9. js-移动端android浏览器中input框被软键盘遮住的问题解决方案

    我遇到的问题:在一个页面里有一个弹出层之前我给我的最外层加了固定定位 用了下面的方法也不好使:没有办法我将之改为绝对定位层级变高在加上一个顶部标签通过js计算顶部高度来实现满屏遮挡: <sect ...

  10. 面向对象设计模式纵横谈:Bridge 桥接模式(笔记记录)

    桥接模式是一个比较难理解的设计模式,设计和分析的时候也不容易把握,咱们听听“李建忠”老师是怎么来讲的.我们还是从演变的角度来说问题,一步一步的来把问题说清楚.先谈谈“抽象”和“实现”的关系. 抽象与实 ...