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. UGUI 实例预制对象位置不对

    public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace); / ...

  2. layoutSubviews相关总结

    ios layout机制相关方法 - (CGSize)sizeThatFits:(CGSize)size - (void)sizeToFit ------- - (void)layoutSubview ...

  3. HDFS 好的文章链接

    http://www.cnblogs.com/linuxprobe/p/5594431.html http://www.daniubiji.cn/archives/596 http://blog.cs ...

  4. 软件工程导论复习 如何画系统流程图和数据流图 part1

    一.数据流图与流程图的区别 数据流程图是以图形的方式表达在问题中信息的变换和传递过程.它把系统看成是由数据流联系的各种概念的组合,用分解及抽象手段来控制需求分析的复杂性,采用分层的数据流程图来表示一个 ...

  5. one by one 项目 part 3

    mysql error:Table 'performance_schema.session_variables' doesn't exist 打开cmd 输入:mysql_upgrade -u roo ...

  6. python函数式编程(转)

    函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是“怎么干”,而函数函数式编程的思考方式是我要“干什么”. 至于函数式编程的特点暂不总结,我们直接拿例子来体会什么是函数 ...

  7. ThreadPoolExecutor的execute源码分析

    上一篇文章指出,ThreadPoolExecutor执行的步骤如下: 向线程池中添加任务,当任务数量少于corePoolSize时,会自动创建thead来处理这些任务: 当添加任务数大于corePoo ...

  8. 常用修图工具的一些使用技巧及问题解决方法——ai

    一.ai如何修改画布大小 一. ai如何修改画布大小: 1. 左上角菜单中的文件——文档设置(也可以直接点菜单栏下边的控制栏中的文档设置) 2. 文档设置界面中,点击右上角“编辑画板“ 3. 此时面板 ...

  9. python之文件操作read

    #open函数,该函数用于文件处理,文件操作一共就有三种方法,打开文件#关闭文件, #先来说下打开文件,打开文件的模式有下面几种# 1.r,只读模式 f = open('test.log','r',e ...

  10. Maven + spring + Mybatis + SpringMVC

    tomcat版本:apache-tomcat-7.0.70 一.新建一个maven的web项目 1.1.请勾选“Create a simple project”,创建一个简单的项目,这里不使用模板.也 ...