转载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. sql2008备份集中的数据库备份与现有的xxx数据库不同解决方法

    原文链接:http://wncbl.cn/posts/1993c22/ 问题描述 今天在配置一个 ASP 站点时,导入以前的数据库备份文件,提示:sql2008备份集中的数据库备份与现有的xxx数据库 ...

  2. 【mysql】一个关于order by排序的问题

    I have a table CREATE TABLE `tableMain` ( `id` int(11) NOT NULL AUTO_INCREMENT, `value1` varchar(45) ...

  3. PYTHON3 urllib2库

    python 3.x中urllib库和urilib2库合并成了urllib库..其中urllib2.urlopen()变成了urllib.request.urlopen() urllib2.Reque ...

  4. C语言流程控制

    顺序结构 顺序结构是最常用的结构,即从上到下的执行语句. int num=5; num++; num=13; 条件结构 条件结构是当表达式为真的时候执行语句块,C语言提供了两种条件结构 if...el ...

  5. python set集合简单使用

    Python 提供了强大的集合操作方法,我们可以完成数学中集合的并集.交集.差集等操作,如下: >>> a = {1,2,3} >>> b = {3,4,5} &g ...

  6. httpclient访问网站时设置Accept-Encoding为gzip,deflate返回的结果为乱码的问题

    近期迷恋上httpclient模拟各种网站登陆,浏览器中的开发者工具中查看请求头信息,然后照葫芦画瓢写到httpclient的请求中去,requestheader中有这么一段设置: Accept-En ...

  7. Sql 随机更新一条数据返回更新数据的ID编号

    DECLARE @parimaryTable(临时表)  Table(prizecode varchar(50)); update top (1)  数据表 set 字段a='数值' ,字段b=‘数值 ...

  8. WEB安全--业务安全漏洞

    0x00 索引说明 在OWASP的分享,关于业务安全的漏洞检测模型. 0x01 身份认证安全 1 暴力破解 在没有验证码限制或者一次验证码可以多次使用的地方,使用已知用户对密码进行暴力破解或者用一个通 ...

  9. JS高程读书笔记-第一、二章-内附在线思维导图和quizlet卡片

    之前在kindle上买了高程,今天又到了纸质的<JavaScript语言精粹>,<高性能JavaScript>,<JavaScipt设计模式>,开始读书之旅啦. 我 ...

  10. java11-2 String面试题

    package cn.itcast_02; /* * String s = new String(“hello”)和String s = “hello”;的区别? * 有.前者会创建2个对象,后者创建 ...