转载http://hi.baidu.com/jackywdx/item/feee8041d2c2e12310ee1e85

Windows应用程序通常是通过对话框接收用户输入、向用户输出信息,本节介绍应用程序中对话框的创建和应用,首先介绍对话框的工作方式、种类及创建方法,然后介绍如何将对话框与程序联系在一起。

3.4.1 对话框的工作方式、种类和创建方法

1. 对话框在应用程序中的工作方式

  前已述及,文档类是应用程序存储数据的地方,而对话框是用户与应用程序之间信息交互的桥梁,那么,文档数据是怎样传递到对话框中,用户输入到对话框中的数据又是怎样反映到文档的呢?

  实际上,用户看到的对话框是一个读入或写出数据的图形界面对象,这一对象由集成开发环境中的对话框模板提供。可以向模板添加各种控件 (controls,如按钮,编辑框,单选复选按钮等),构成程序的 对话框资源 ;应用程序要使用对话框还需定义一个CDialog派生类的 对话框类 与 资源相连接,并在这个对话框类中定义一些成员变量与对话框中的控件相对应,提供对话框控件的缺省数据值 ,对话框类的函数成员负责对话框的打开与关闭、数据的传递等 ;程序运行时需要用到对话框时依据对话框资源激活对话框,接收用户输入后通过 对话框类的 成员函数更新文档类数据成员,如图3.17示。

MFC中,各  种控件都有相应的类,如CEdit,CStatic,CButton,CListBox,CComboBox,它们都派生自CWnd类,因此,都继承了窗口类的所有函数;在对话框中,它们是对话框的子窗口。

2. 对话框的种类

  Windows中有两种对话框,模态对话框和非模态对话框,构造两种对话框的大多数工作都相同,只是两者的显示和数据处理有些不同。

   模态对话框 (Modal Dialog Boxes)工作时使其父类窗口无效,直到对话框结束,也就是说,该对话框打开后,程序等待用户输入并关闭对话框后才执行其它任务。例如Windows中 常见的File|Open对话框,需用户选择一个文件打开或按取消按钮关闭对话框后程序才继续执行。对系统而言,打开一个模态对话框相当于函数调用,只有 当函数运行结束,从被调函数返回时,主调函数才能执行下一步。调用DoModal函数可以显示模态对话框。如:

CMyDialog dlg ; dlg.DoModal(); DoModal返回用户按下的按钮ID值(如IDOK或IDCANCEL),按下OK或CANCEL按钮后,自动调用CDialog::EndDialog关闭对话框。

  非模态对话框 ( Modeless Dialog Boxes) 与模态对话框相反,对话框打开期间,允许用户切换到程序其它部分,不一定要关闭对话框。 WinWord中的Find and Replace对话框就是一个典型的非模态对话框。对系统而言,一个非模态对话框相当于另一个需要支持的线程,可以说是执行中的另外一个程序。调用Create函数创建并显示非模态对话框:  CMyDialog dlg; dlg.Create();

  用户按下 OK或CANCEL按钮不会关闭对话框,可重定义OnOK和OnCancel函数,调用DestroyWindow关闭对话框:

void CMyDialog::OnOK() { …  DestroyWindow(); }  void CMyDialog::OnCancel() {  DestroyWindow(); }

3. 对话框的创建与编辑

3.4.2 将对话框与程序连结

1. 对话框类及数据成员的定义

a)创建对话框类
对话框资源创建后,在对话框中右击鼠标,选择 ClassWizard菜单项,会出现如图3.22的提示框,说明新建的对话框资源是新资源,是否需要建立一个新类或选择一个已存在的类。 
若选择新类,出现图3.23示的New class对话框,按照VC命名规则为新类取名,取CStudentDlg,Base class选CDialog,Dialog ID选新建的对话框资源ID,按OK在WorkSpace中可看到新增加的类,自动生成的StudentDlg.h头文件和StudentDlg.cpp源文件。
b)增加数据成员

  要使对话框能与程序通讯,还需给对话框类增加数据成员,以保存各控件的初始值,并从控件读取数据。 与控件对应的数据成员可以是变量或控件类型,如表 3.10所示。 表 3.10  对话框与控件对应的变量或控件数据成员

分类

变量成员

控件成员

用途

用于控件初始化或保存控件值,成员变量可以是任何数据类型如编辑框的值可以是整型或字符串,复选框的值是 BOOL类型

控件成员变量是相应控件类的对象,可以调用控件类的成员函数,如列表框,定义一个 CListBox类型变量,可以通过控件使用类的成员函数以初始化列表框

说明

一个控件可以定义其中一种也可定义两种

   在 ClassWizard的Member Variables页面,选择对话框类,在Control IDs中列出了对话框中所有控件ID,如图3.24,选择某个ID,按Add Variable…按钮,弹出Add Member Variable对话框,可输入成员名,在Category中选择值(value)变量或控件(controls)类型,在Variable type列表框中,若是Value类,选择变量数据类型,若是Controls,选择控件类,按OK,成员添加成功。

针对上例,定义了如图 3.25示的数据成员变量表。

数据成员定义后,在对话框第一次显示时需对其初始化。有两种方法初始化成员变量:一是在对话框类的构造函数中初始化,由 ClassWizard自动生成;二是构造对话框对象后进行初始化。为使用方便,对话框变量成员一般定义成public访问权限,因此可以在使用对话框的地方初始化。
图 3.24  为对话框添加数据成员

图 3.25  对话框的变量和控件数据成员

例如: CStudentDlg::CStudentDlg(CWnd* pParent /*=NULL*/) : CDialog(CStudentDlg::IDD, pParent) {  //{{AFX_DATA_INIT(CStudentDlg)  m_sDepart = _T("");  m_dComputer = 0.0;  m_dEnglish = 0.0;  m_nID = 0; m_dMath = 0.0; m_sName = _T("");  m_dPhysics = 0.0;  m_nSex = -1;  //}}AFX_DATA_INIT  }

  ClassWizard自动在构造函数中初始化变量,代码放在//{{AFX_ 和//}}AFX_括号中间,一般不需要对其改动。 ClassWizard还为对话框生成了DDX(Dialog Data Exchange)函数成员DataExchange,此函数不应被显式调用,而由UpdateData函数调用 ,可以实现在对话框控件与对话框数据成员之间的双向数据交换 。  UpdateData(FALSE),将对话框对象的成员变量值拷至对话框控件 ,用于向用户显示数据。 UpdateData(TRUE)将对话框控件中数据拷贝至对话框对象成员变量,缺省值是TRUE。 如果选择对话框的 OK按钮关闭对话框,会自动调用UpdateData()。  对分组的单选按钮,在 ClassWizard中只出现组内第一个控件的ID,增加一个成员变量,类型只能是int,选中第一个,其值为0,第二个值为1,依此类推。 
2. 对话框的显示

  对于模态对话框,调用其 DoModal函数显示,按OK或Cancel按钮关闭对话框,并作相应数据处理。对于非模态对话框,调用Create函数创建并显示对话框,用DestroyWindow关闭对话框。 例 如设在文档类中有 CStudent对象stu,其成员函数SetName为姓名赋值;视图类响应输入命令(如增加一个菜单命令Input,响应函数为OnInput),为 输入学生信息打开对话框,则下面代码为对话框按OK按钮后,用对话框成员变量更新文档数据。

void CEx3_1View::OnInput() {  // TODO: Add your command handler code here  CEx3_1Doc* pDoc = GetDocument();  CStudentDlg dlg; // 构造对话框对象 if(dlg.DoModal()==IDOK) { // 显示对话框并选择 OK 按钮后  pDoc->stu.SetName(dlg.m_sName); // 将对话框数据赋给文档数据成员  … }  }  又如,可以通过菜单命令,调用函数 ShowData ,用对话框显示文档数据。先构造对话框变量,然后用文档数据为对话框数据成员赋值,再显示对话框,代码如下:

void CEx3_1View::ShowData() {  // TODO: Add your command handler code here  CEx3_1Doc* pDoc = GetDocument();  CStudentDlg dlg; // 构造对话框对象  strcpy(dlg.m_sName,Doc->stu.GetName); // 将文档数据成员赋给对话框数据成员 dlg.m_iNum = Doc->stu.Num;  …  dlg.DoModal() // 显示对话框 , 控件显示文档数据  }

3. 为控件添加或修改消息响应函数

   打开 ClassWizard ,在 Message Map 页面,可以为控件添加响应函数。如图 3.26 ,选择 CStudentDlg 类,在 Object IDs 中选择 IDOK ;在 Message 框中选择 BN_CLICKED( 单击 ) 消息,按 Add Function… 按钮,弹出 Add Member Function 对话框,接受缺省的函数名 OnOK ,或为成员函数修改名称,按下 OK 按钮,就为 CStudentDlg 类添加了 OK 按钮的响应函数,同样方法可为其它按钮添加响应函数。 Class Wizard 在类的声明中添加函数原型,并在类的 cpp 文件中添加空的函数体,由程序设计人员完成函数代码。

选择 OK 按钮后,调用 OnOK 函数。 
void CStudentDlg::OnOK() { 
// TODO: Add extra validation here 
UpdateData(); // 首先使数据传送至对话框成员变量  CDialog::OnOK(); // 调用基类 OnOK 并关闭对话框 }

MFC中对话框类(Dialog)的应用的更多相关文章

  1. 列表控件ListBox关联的MFC中的类:CListBox

    列表控件ListBox关联的MFC中的类:CListBox ######################################################## 1.在列表的结尾添加一项: ...

  2. 高级列表控件ListCtrl关联的MFC中的类:CListCtrl

    高级列表控件ListCtrl关联的MFC中的类:CListCtrl■ 报表样式ListCtrl常用操作:1.添加列标题头:InsertColumn2.获取与设置列宽:GetColumnWidth.Se ...

  3. MFC中 自定义类访问主对话框控件的方法

    之前一直在找有木有好点的方法.现在终于被我找到,收藏之~~~~~~ 在使用mfc的时候经常遇到自定义类访问主对话框控件的问题,例如自定义类中的方法要输出一段字符串到主对话框的EDIT控件.控制对话框的 ...

  4. MFC中用户自定义类响应自定义消息

    这篇技术文章不是讨论经典的MFC中的消息工作机理的,讨论消息工作原理.方式和路径的文章在网上和书本中随处可见.网上众多的讨论都是关于如何响应并进行用户自定义消息映射的:网上还有一些文章介绍如何在自定义 ...

  5. MFC中CArray类原理及其应用

    1.CArray类应用 函数简介CArray::GetSize int GetSize( ) const;取得当前数组元素个数. CArray::GetUpperBound int GetUpperB ...

  6. MFC中对话框的工具栏的使用

    1.新建一个MFC项目:在资源视图中新建Toolbar资源: 2.编辑状态栏: 3.在***Dlg.h文件中添加CToolBar类型或其派生类型的一个变量如:(CdlgToolBar myToolBa ...

  7. MFC中对话框的各种消息触发时间

    小结:WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕.可以安全的使用这个窗口了,例如在它上面画控件等等.这个状态肯定是在调用ShowWindows()显示窗口之前.WM_WM_IN ...

  8. MFC中Doc类获取View类的方法(SDI)

    从view类中获取Doc的方法如下: CYourDoc* pDoc = GetDocument(); 这个函数已经写好,所以无需自己添加,使用时直接利用pDoc即可. 若反过来,从Doc中获取View ...

  9. MFC中CListCtrl类依靠CImageList贴图并显示不同图像

    只介绍主要方法,函数的具体参数可在MSDN上查阅 ------------------------------------------- CListCtrl     m_ListCtrl; CImag ...

随机推荐

  1. 在Dynamics CRM 2015中通过3CX插件(以及3CX windows phone)拨出电话

    背景 在On-premises部署的Dynamics CRM中实现通过网页拨通客户电话的功能 要点 3CX 提供了开箱即用的Dynamics CRM Solution,只需要在Microsoft Dy ...

  2. openstack kilo compute更新后报错IncompatibleObjectVersion: Version 1.2 of PciDeviceList is not supported

    前几天在compute节点更新openstack的包后,发现报错IncompatibleObjectVersion: Version 1.2 of PciDeviceList is not suppo ...

  3. 搭建openvpn 未完成。。。

    轻松构建自己的OpenVPN家庭服务器(VMware+Amahi) http://os.51cto.com/art/201107/277146_all.htm  这是教程 不用安装第一步的,直接把下载 ...

  4. 用java程序输出自己的姓名

    代码部分: public class Hello { public static void main(String[] args) { System.out.println("$$$$$$$ ...

  5. html页面识别当前系统和语言

    项目中需要一个下载功能,根据系统跳转到不同的页面,如iphone跳转到IOS页面,android跳转到android页面. 下面为页面判断页面: <!DOCTYPE HTML> <h ...

  6. Swing应用开发实战系列之一:自定义JdbcTemplate

    笔者本人真正意义上接触编程开发是在2004年,最早用的就是VB,然后是Delphi等,后来转到.Net,中间断断续续还用过PowerBuilder等,无一例外,所研发设计的项目或系统都是WinForm ...

  7. mysql主从同步问题解决汇总

    出现问题原因:出现这个问题的原因是之前曾做过主从复制!问题:ERROR 1201 (HY000): Could not initialize master info structure; more e ...

  8. 启动rabbitmq web管理后台插件

    安装完rabbitmq server之后,访问http://server_ip:15672/  无法打开网页, 通过netstat -ano |grep 15672 查看此端口号并没有开启 需要启用 ...

  9. 动手学习TCP:服务端状态变迁

    上一篇文章介绍了TCP状态机,并且通过实验了解了TCP客户端正常的状态变迁过程. 那么,本篇文章就一起看看TCP服务端的正常状态变迁过程 服务端状态变迁 根据上一篇文章中的TCP状态变迁图,可以得到服 ...

  10. docker containerd shim分析

    // containerd-shim is a small shim that sits in front of a runtime implementation that allows it to ...