第8章(1) 乘法计算器_y_第1页
第8章(1) 乘法计算器_y_第2页
第8章(1) 乘法计算器_y_第3页
第8章(1) 乘法计算器_y_第4页
第8章(1) 乘法计算器_y_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于案例的Visual C+程序设计教程 第8章 对话框和控件(1) 1本讲主要内容1. 基于对话框的应用程序 2. 静态文本控件3. 文本编辑框控件4. 按钮控件 5. 为控件定义关联变量 6. DDX/DDV7. CString28.1 案例描述本章以计算器为案例背景,从简单到复杂逐步实现多个版本的计算器程序,从中学习对话框的工作原理以及各种控件的使用方法。3 8.2 基于对话框的应用程序静态文本控件文本编辑框控件按钮控件48.2.1 基于对话框的应用程序通过前面章节C+的学习,读者已经熟悉了如何构建控制台应用程序,但它不是真正意义上的Windows可视化程序。本讲以构建乘法计算器程序为例

2、,开始介绍基于对话框的Windows可视化程序的编写方法。 5建立对话框应该程序的操作步骤操作步骤:(1)启动Visual C+ 6.0集成开发环境,单击菜单栏中File|New命令,打开New窗口。【例例8-18-1】乘法计算器。实现两个十进制数的相乘运算。6(2)在New窗口中选择Projects选项卡,在列表中选择MFC Appwizardexe项,在Project name文本框中输入工程名Multiplication,在Location文本框中设置工程文件存放的位置,如:“E:VCMultiplication” 。7工程类型工程类型工程名工程名保存位置保存位置8(3)单击OK按钮,弹

3、出MFC Appwizard Step 1窗口 基于对话框的基于对话框的应用程序应用程序9(4)选择Dialog based单选项,单击Next按钮,打开MFC AppWizard Step 2 of 4窗口 10(5)保持默认选项,单击Next按钮,打开MFC AppWizard Step 3 of 4窗口 11(6)保持默认选项,单击Next按钮,打开MFC AppWizard Step 4 of 4窗口 12(7)保持默认选项,单击Finish按钮,打开New Project Information窗口 13(8)单击OK按钮完成对话框应用程序的创建,返回Visual C+ 6.0集成开

4、发环境,开始进入可视化程序设计阶段。 14158.2.2 控件的基本概念 控件控件就是编程开发工具提供的、规范化的、独立的小部件,它是可视化开发工具的重要组成部分。在对话框与用户的交互过程中,控件担任着重要角色。 168.2.3. 对话框组成及运行机制 Multiplication.h和Multiplication.cpp定义应用程序类,负责完成应用程序的初始化、程序的启动和程序运行结束时的清理工作; MultiplicationDlg.h和MultiplicationDlg.cpp定义主对话框类,负责完成对话框界面的生成和事件响应; StdAfx.h和StdAfx.cpp包含项目中常用到的M

5、FC头文件; Resource.h定义项目中所包含的资源标识符ID; MultiplicationDlg.rc用于定义项目中的资源。 178.2.3. 对话框组成及运行机制 资源通过标识符ID唯一标识,一个项目中所有的资源标识符都放在Resource.h文件中。 从MFC编程的角度来看,一个对话框由两部分组成:对话框资源和对话框类,这也是Windows编程的一个主要特点,即资源和代码分离。 18 在MFC应用程序中有一个CWinApp派生类的对象theApp(在Multiplication.cpp文件中定义),它是一个全局变量,代表了应用程序运行实例的主线程。 那么程序是如何运行的?对话框是如

6、何显示的?程序是如何响应按钮单击操作的? 在CWinApp派生类的所有成员函数中,只有InitInstance()函数是派生类唯一需要重载的函数。该函数负责应用程序的初始化工作 19BOOL CMultiplicationApp:InitInstance()CMultiplicationDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)else if (nResponse = IDCANCEL)return FALSE;定义了一个对话框对象dlg DoModal()函数负责对话框的显

7、示和撤销,包括载入对话框资源,调用CDialog:OnInitDialog()函数初始化对话框和将对话框显示在屏幕上。然后启动一个消息循环,以响应用户的输入。 20BOOL CMultiplicationApp:InitInstance()CMultiplicationDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)else if (nResponse = IDCANCEL)return FALSE;若用户在对话框内单击了ID为IDOK的按钮,则CDialog:OnOK()函数将被

8、调用。OnOK()函数调用CDialog:EndDialog()函数关闭对话框。关闭对话框后,DoModal()会返回值IDOK。 若用户在对话框内单击了ID为IDCANCEL的按钮,则CDialog:OnCancel()函数被调用。该函数调用CDialog:EndDialog()函数关闭对话框。关闭对话框后,DoModal()会返回值IDCANCEL。 218.2.4 对话框的属性 对话框的属性都是由集成开发环境设置的默认值,如果想重新设置对话框,只需在对话框资源窗口中单击鼠标右键,在弹出的快捷菜单中选择Properties命令,打开对话框资源的属性窗口 22【例例8-18-1续续】在例8-

9、1基础上,修改对话框的标题。 修改对话框属性的操作步骤:操作步骤:(1)单击鼠标右键,选择Properties命令,打开Dialog Properties对话框23(2)在General选项卡中的Caption编辑框中录入“乘法计算器”。(3)编译、链接、运行。248.2.5. 静态文本控件 静态文本控件用来显示一个文本串。默认情 况 下 , 所 有 静 态 文 本 控 件 的 I D 都 为IDC_STATIC,如果需要单独处理某个静态文本控件,则需要为其重新设置一个唯一的ID值。静态文本控件最长能够显示255个字符,可以使用n实现换行。 25【例例8-18-1续续】在8.2.4节中的例8-

10、1续基础上,添加“*”和“=”静态文本控件。 添加静态文本控件的操作步骤:操作步骤:(1)打开Multiplication工程,删除对话框上原有的静态文本控件和两个按钮。26(2)单击控件工具栏中“静态文本控件”按钮,当鼠标移动到对话框上后变为十字形,然后在对话框中单击鼠标,生成一个静态文本控件。27(3)右键单击该静态文本控件,选择Properties命令,在Caption编辑框文本改为“*” 。28(4)调整对话框大小。(5)重复步骤(3)添加静态文本控件,将其Caption编辑框文本改为“=” 。(6)编译、链接、运行。298.2.6. 文本编辑框控件 当乘法计算器程序的提示信息设置完毕

11、后,需要录入计算数值,Visual C+提供了文本编辑框控件来完成此项工作。 文本编辑框是用户从键盘输入、编辑文本的矩形窗口,既可以是单行,也可以是多行,多行文本编辑框的行号从零开始。在一个多行编辑框中,除了最后一行外,每一行的结尾处都有一对回车换行符(“rn”),这对回车换行符是文本换行的标志。 30【例例8-18-1续续】在8.2.5节中的例8-1续基础上,添加“操作数”和“计算机结果文本编辑框控件。 添加文本编辑框控件的操作步骤:操作步骤:(1)单击控件工具栏中“文本编辑控件”按钮,当鼠标移动到对话框上后变为十字形,然后在对话框中单击鼠标,生成一个文本编辑控件。31( 2 ) 右 键 单

12、 击 该 文 本 编 辑 框 控 件 , 选 择Properties命令,将General选项卡中的ID修改为IDC_OPERAND1,Styles选项卡中的Align text改为Right。(3)参照步骤(1)和步骤(2),添加文本编辑框,ID修改为IDC_ OPERAND2。32(4)参照步骤(1)和步骤(2),添加文本编辑框,ID分别修改为IDC_RESULT。另外由于计算结果不需要用户输入,所以将Styles选项卡中的Read-only选中,编辑框变为灰色,不能编辑。(5)编译、链接、运行。 338.2.7. 为控件定义关联变量 当用户在文本编辑框中输入数据时,程序如何获得相应的内容

13、呢?MFC允许为每个控件定义关联变量,该关联变量可以与控件实现联动或数据交换。 34【例8-1续】在8.2.6节中的例8-1续基础上,为三个文本编辑框分别添加一个关联变量。 为控件定义关联变量的操作步骤:操作步骤:(1)选择菜单View|ClassWizard命令,在弹出的对话框中选择Member Variables选项卡。其中Project列表框用于选择工程名,即Multiplication;C l a s s n a m e 列 表 框 指 定 类 名 , 选 择CMultiplicationDlg,其含义为添加的关联变量作为该类的成员变量;Control IDs中列出了CMultipli

14、cationDlg类中所有控件的ID。35工程名类名控件列表36(2)在Control IDs处选择IDC_OPERAND1选项,单击Add Variable按钮,从中可设置控件IDC_OPERAND1关联的变量名称、类别和数据类型。在Member Variable name中输入m_dOperand1,在Category中选择Value,在Variable type中选择double,单击OK按钮。37 大多数控件的Category列表框都有Value和Control两个可选项。 Control所对应的Variable type是MFC为该控件封装的控件类; Value所对应的Variabl

15、e type各不相同,有CString、int、UINT、long、BOOL、float、double等类型。 为控件添加Control类型关联变量可以控制该控件的行为,添加Value类型关联变量可以方便获取控件数据。MFC允许为同一控件最多关联两个变量,即为Value和Control各关联一个变量。 38( 3 ) 用 同 样 的 方 法 为 文 本 编 辑 框IDC_OPERAND2和IDC_RESULT添加关联变量m_dOperand2和m_dResult。对于添加的关联变量,根据不同的数据类型,可以设置限制,如double类型可设置最大、最小值;CString类型可设置最大字符数等 3

16、98.2.8 DDX/DDV机制当关联变量添加完毕后,ClassWizard自动对源文件做了如下修改。 (1)在MultiplicationDlg.h文件中添加了关联变量的声明。class CMultiplicationDlg : public CDialog /AFX_DATA(CMultiplicationDlg) enum IDD = IDD_MULTIPLICATION_DIALOG ; doublem_dOperand1; doublem_dOperand2; doublem_dResult; /AFX_DATA;40(2)在MultiplicationDlg.cpp文件中CMult

17、iplicationDlg类的构造函数中添加了初始化代码:CMultiplicationDlg:CMultiplicationDlg(CWnd* pParent /*=NULL*/): CDialog(CMultiplicationDlg:IDD, pParent)/AFX_DATA_INIT(CMultiplicationDlg)m_dOperand1 = 0.0;m_dOperand2 = 0.0;m_dResult = 0.0;/AFX_DATA_INIT41(3)在MultiplicationDlg.cpp文件中DoDataExchange函数中添加了如下代码:void CMultip

18、licationDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);/AFX_DATA_MAP(CMultiplicationDlg)DDX_Text(pDX, IDC_OPERAND1, m_dOperand1);DDX_Text(pDX, IDC_OPERAND2, m_dOperand2);DDX_Text(pDX, IDC_RESULT, m_dResult);/AFX_DATA_MAPMFC为了使控件与关联变量能够绑定,提供了对话框数据交换(Dialog Data Exchange,DDX)和对话框数据验

19、证有效性(Dialog Data Verify,DDV)机制。 42DDX机制将对话框资源中的控件和对话框类的一个成员变量之间建立关联,使成员变量和控件之间的数据交换更加容易。DDV机制用于在返回成员变量之前自动校验数据的长度和范围,并发出相应的警告信息。43 DDX函数是一个全局函数,其函数声明如下: void AFXAPI DDX_type(CDataExchange *pDX,int CtrlID,VariableType& m_data); 其中type表示成员变量的类别,可以为Control或Text;pDX是一个指向CDataExchange数据交换类对象的指针;CtrlI

20、D是进行数据交换的控件ID;m_data是进行数据交换的成员变量名。 如“DDX_Text(pDX, IDC_OPERAND1, m_dOperand1);”表示m_dOperand1是一个Value值类别的成员变量,用于与IDC_OPERAND1文本编辑框控件实现数据交换。44 DDV函数也是全局函数,有两种重载形式,分别用于校验字符串数据和数值数据。 void AFXAPI DDV_MaxChars(CDataExchange *pDX,CString const& m_data ,int nChars); void AFXAPI DDV_MinMaxVariableType(CD

21、ataExchange *pDX, VariableType m_data, VariableType minVal, VariableType MaxVal); 其中VariableType是成员变量的数据类型,m_data是成员变量,nChars是字符串数据的最大长度,minVal和maxVal分别是数值数据的最小值和最大值。 45 如“DDV_MinMaxDouble(pDX, m_dOperand1, 0., 100.);”表示double类型成员变量m_dOperand1的最小值和最大值分别是0.0和100.0。 如果用户输入的数值超过这个范围,DDV就显示信息对话框,提示用户有效的

22、输入范围。 另外程序如果已经指定文本编辑框控件与double类型变量关联,那么当用户输入的不是数值,DDV也会提出提示。46 上两个信息对话框并不是用户在输入数据后立即弹出,而是在调用DoDataExchange()函数时才会出现的。 但MFC程序中一般不直接调用DoDataExchange()函数,而是通过UpdateData()函数间接调用。 47 可以通过UpdateData()函数的参数控制数据在控件和关联变量之间的传递方向: 当调用UpdateData(TRUE)时,程序通过调用DoDataExchange()函数将数据从控件传递到关联变量。 当调用UpdateData(FALSE)

23、时,程序通过调用DoDataExchange()函数将数据从关联变量传递到控件,实现了控件在刷新后重新获取关联变量的值。48在对话框初始化时或关联变量数据发生变化时需要调用UpdateData(FALSE)函数,以使控件正确显示数据内容;如果要获取用户在控件中的输入信息时,需要调用UpdateData(TRUE)。DDX和DDV不仅适用于文本编辑框,还适用于单选按钮、复选按钮、组合框等控件,MFC为它们提供了对应的DDX和DDV函数。498.2.9 按钮控件 当用户录入两个相乘的数值后,程序不会自动得到结果,那么程序何时开始计算呢?这通常需要有一个外部事件来触发计算过程的执行。MFC可利用按钮

24、控件来完成此功能,当按钮控件按下后会产生一个事件,执行对应的响应函数。 50【例例8-18-1续续】在8.2.7节中的例8-1续基础上,添加一个“计算”按钮控件。添加按钮控件的操作步骤:操作步骤:(1)单击控件工具栏中按钮控件,当鼠标移动到对话框上后变为十字形,然后在对话框中单击鼠标,生成一个按钮控件。51(2)右键单击该按钮控件,选择Properties命令,将General选项卡中的ID修改为IDC_CALC,Caption修改为:“计算”。52(3)选择菜单View|ClassWizard命令,在弹出的对话框中选择Message Maps选项卡,Object IDs列表框显示该类包含的所

25、有对象标识ID;Messages列表框显示Object IDs列表框中被选中控件具有的所有消息。53该类包含的所有对象标识所选控件具有的消息54(4)在Object IDs列表框中选择IDC_CALC选项,在Messages列表框中选择BN_CLICKED消息,然后单击Add Function按钮。55( 5 ) 单 击 O K 按 钮 , 系 统 会 自 动 生 成 响 应IDC_CALC按钮单击事件的消息处理函数OnCalc(),并返回到ClassWizard对话框。然后单击右侧中部的Edit Code按钮,自动打开该函数所在的源代码文件(CMultiplicationDlg.cpp),并

26、定位到该函数的实现代码处。56(6)在OnCalc()函数中添加如下代码:void CMultiplicationDlg:OnCalc() / TODO: Add your control notification handler code hereUpdateData(TRUE);/获取用户输入的数值m_dResult = m_dOperand1 * m_dOperand2;UpdateData(FALSE);/将计算结果显示在界面上(7)编译、链接、运行程序。578.2.10. 控件布局管理 为了使界面美观,这6个控件应保证水平对齐并且间隔相同,控件布局管理就是调整对话框中一组控件的大小或

27、位置的工具 。58【例例8-18-1续续】在8.29节中的例8-1续基础上,合理布局乘法计算器中的控件。 控件布局关联的操作步骤:操作步骤:(1)拖动IDC_OPERAND1文本编辑框,使之垂直居中,并靠对话框左侧;拖动IDC_CALC按钮,使之垂直居中,并在靠对话框右侧。(2)按住Shift键,依次选中各控件,最后一个被选中的控件是参考控件,其被选中框为8个实点。59(3)选择菜单Layout|Align|Vert. Center命令,所有的控件都以IDC_OPERAND1文本编辑框的垂直中心位置对齐。(4)继续选择菜单Layout|Space Evenly| Across命令,所有的控件以

28、IDC_OPERAND1文本编辑框和IDC_CALC按钮作为两端边缘,平局分布各控件的水平方向位置。(5)鼠标单击空白区域,释放选择的控件,控件布局结束 608.2.11 CString类 CString是MFC中的一种很有用的数据类型,它简化了字符串的各种操作。 61(1)字符串连接。使用CString 类型能够很方便地连接两个字符串,如:CString msg1 = Hello;CString msg2 = World;CString msg = msg1 + msg2;62(2)字符串转换为数值。在C语言中存在函数atof()可以将字符串转换为数值,不需要逐个字符解析。其函数声明为:do

29、uble atof(const char *nptr);CString对象作为参数也可以完成转换。CString digital = 123.45;double d = atof(digital); /d=123.45 63(3)字符串格式化。字符串格式化是把其它类型数据转化为CString类型的方法。如:把一个整数转化成CString类型,可用如下方法:CString s;s.Format(“%d”,10);Format()函数的参数与C语言中printf()函数的参数含义相同。64(4)删除指定字符串。CString类提供TrimLeft()和TrimRight()函数删除指定的字符串。其

30、函数声明为:void TrimLeft(); void TrimLeft(TCHAR chTarget); 如果没有参数,从左删除字符(nt空格等),至到遇到一个非此类字符。65 如果指定的参数是字符串,从字符串左边看起,遇到括号中出现的字符(参数)全部截去,直到出现第一个括号中未出现的字符时停止截除,即使后面又出现了参数中有的字符也不会截去了。CString s=0123456789;s.TrimLeft(02);结果s=123456789。 66(5)获得特定子串,CString类提供Left()和Right()函数来获取从字符串左侧开始或右侧开始的连续若干个字符,其函数声明为:CStri

31、ng Left(int nCount) const; CString Right(int nCount) const;其中nCount个字符的个数 CString s=123456789; CString l=s.Left(5);/l=12345 CString r=s.Right(5);/r=5678967( 6 ) 获 得 字 符 串 长 度 , C S t r i n g 类 提 供GetLength()函数来获取字符串的长度,其函数声明为: int GetLength( ) const;688.2.12补充案例 【例例8-3】 简单通讯录。通讯录包括姓名和电话号码,通过单击按钮将录入的

32、信息保存在一个多行的文本编辑框中。69(1)创建基于对话框的Record工程。(2)删除对话框中原有的“确定”、“取消”按钮和静态文本控件,然后添加3个文本编辑框、2个静态文本控件和1个按钮,布局如下图。70(3)修改文本编辑框控件属性及ID,最左侧文本编辑框控件ID为IDC_RECORD,属性设置如下图 所 示 ; 右 侧 上 方 文 本 编 辑 框 控 件 I D 为IDC_NAME,其他设置不变;右侧下方文本编辑框控件ID为IDC_PHONENUMBER,并将Styles选项卡中的Number选中,其他设置不变。71(4)修改其他控件,按钮控件ID为IDC_ADD,Caption为“添加

33、”;对话框控件Caption为:“通讯录”。(5)为文本编辑框控件添加关联变量,单击菜单View|ClassWizard命令,在Member Variables选项卡中添加如下图所示的关联变量。7273(6)为按钮控件添加消息响应函数,单击菜单View|ClassWizard命令,在Message Maps选项卡中为IDC_ADD按钮添加BN_CLICKED消息响应函数OnAdd()。74(7)在函数OnAdd()中添加代码如下:void CRecordDlg:OnAdd() UpdateData(TRUE);/获取用户输入信息/姓名和电话号码同时不为空if(!m_strName.IsEmpty() & !m_strPhoneNumber.IsEmpty()m_strRecord += m_strName;m_strRecord += ;m_strRecord += m_strPhoneNumber;m_strRecord += rn;m_strName = ;m_strPho

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论