讲座三VSMFC编程对话框加法计算器.docx
- 文档编号:12257261
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:12
- 大小:23.09KB
讲座三VSMFC编程对话框加法计算器.docx
《讲座三VSMFC编程对话框加法计算器.docx》由会员分享,可在线阅读,更多相关《讲座三VSMFC编程对话框加法计算器.docx(12页珍藏版)》请在冰豆网上搜索。
讲座三VSMFC编程对话框加法计算器
VS2010(MFC)编程—对话框程序
一、VS2010(MFC)编程--对话框:
创建对话框模板和修改对话框属性
对话框,大家应该很熟悉了,在我们常用的软件中大多都有对话框界面,例如,360安全卫士的主界面其实就是个对话框,只是它做了很多美工方面的工作,将其大大美化了。
创建对话框主要分两大步,第一,创建对话框资源,主要包括创建新的对话框模板、设置对话框属性和为对话框添加各种控件;第二,生成对话框类,主要包括新建对话框类、添加控件变量和控件的消息处理函数等。
在本节中先讲讲怎样创建对话框模板和设置对话框属性。
创建基于对话框的应用程序框架
这里创建一个基于对话框的应用程序,用来实现加法运算的功能。
创建步骤同单文档应用程序大同小异,简单步骤如下:
1.选择菜单项File->New->Project,弹出“NewProject”对话框。
2.左侧面板中InstalledTemplated的VisualC++下选择MFC,中间窗口中选择MFCApplication,然后在下面的Name编辑框中键入工程名称,本例取名“Addition”,在Location编辑框中设置工程的保存路径。
点“OK”。
3.点“Next”到“ApplicationType”对话框,在Applicationtype下选择Dialogbased,其他使用默认设置,点“Finish”。
我们可以在SolutionExplorer视图中看到,此工程的文件要比单文档应用程序少的多,在ClassView中主要有三个类:
CAboutDlg、CAdditionApp和CAdditionDlg。
CAboutDlg是应用程序的“关于”对话框类,CAdditionApp是由CWinApp派生的类,CAdditionDlg是主对话框类,主对话框也就是此应用程序运行后显示的主要界面。
注:
如果在VS2010中找不到SolutionExplorer或ClassView等视图,可以在菜单项View下找到对应视图选项选择即可。
在VS2010的使用介绍中已经有讲解。
在ResourceView视图中可以看到工程Addition的资源树,展开Addition.rc,下面有四个子项:
Dialog(对话框)、Icon(图标)、StringTable(字符串表)和Version(版本)。
然后展开Dialog项,下面有两个对话框模板,其ID分别为:
IDD_ABOUTBOX和IDD_ADDITION_DIALOG,前者是“关于”对话框的模板,后者是主对话框的模板。
ID是资源的唯一标识,本质上是一个无符号整数,一般ID代表的整数值由系统定义,我们无需干涉。
对话框模板
可见对于主对话框来说,创建对话框第一步中的创建新的对话框模板已经由系统自动完成了。
而如果是再添加对话框需要创建新的对话框模板时,需要在ResourceView的“Dialog”节点上点右键,在右键菜单中选择“InsertDialog”,就会生成新的对话框模板,并且会自动分配ID。
在ResourceView的资源树中双击某个ID,可在中间区域内显示相应的资源界面。
双击IDD_ADDITION_DIALOG时,中间区域就会显示Addition对话框模板。
如下图:
设置对话框属性
在Addition对话框模板上点右键,然后在右键菜单中选择Properties,则在右侧面板中会显示对话框的属性列表。
如下图:
在这里对经常使用的几个属性作简单说明,并对Addition对话框进行属性设置说明。
1.ID:
对话框ID,唯一标识对话框资源,可以修改。
此处为IDD_ADDITION_DIALOG,我们不修改它。
2.Caption:
对话框标题。
此处默认为Addition,我们将其修改为“加法计算器”。
3.Border:
边框类型。
有四种类型:
None、Thin、Resizing和DialogFrame。
我们使用默认的DialogFrame。
4.Maximize:
是否使用最大化按钮。
我们使用默认的False。
5.Minimize:
是否使用最小化按钮。
同样我们使用默认的False。
6.Style:
对话框类型。
有三种类型:
Overlapped(重叠窗口)、Popup(弹出式窗口)和Child(子窗口)。
弹出式窗口比较常见。
我们使用默认的Popup类型。
7.SystemMenu:
是否带有标题栏左上角的系统菜单,包括移动、关闭等菜单项。
我们使用默认的True。
8.TitleBar:
是否带有标题栏。
我们使用默认的True。
9.Font(Size):
字体类型和字体大小。
如果将其修改为非系统字体,则UseSystem自动改为False。
而如果UseSystem原来为False,将其修改为True,则Font(Size)自动设置为系统字体。
这里我们使用默认的系统字体。
根据以上说明,其实我们只修改了标题属性。
这时我们运行此程序后的界面如下:
VS2010/MFC编程--对话框:
为对话框添加控件
创建对话框资源需要创建对话框模板、修改对话框属性、为对话框添加各种控件等步骤,前面一讲中已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件。
上一讲中创建了一个名为“Addition”的工程,目的是生成一个实现加法运算的应用程序。
实现加法计算有几个必要的因素:
被加数、加数、和。
被加数和加数需要输入,和需要输出显示。
那么这几个因素都需要相应的控件来输入或显示,下面就一步步讲解如何添加这些控件。
1.为对话框添加一个静态文本框(StaticText),用于显示字符串--“被加数”。
上一讲中生成的资源模板中自动添加了一个标题为“TODO:
Placedialogcontrolshere.”的静态文本框,我们可以修改它的标题继续使用,也可以删掉它。
这里为了从头讲解静态文本框的添加过程,将它删掉,继续添加新的静态文本框。
删除控件时,可以使用鼠标左键点击选中它,选中后控件的周围会出现虚线框,然后按Delete键就可以将其删除了。
在“Addition”工程的ResourceView中打开上一讲中创建的对话框模板IDD_ADDITION_DIALOG,自动添加的静态文本框就可以使用这种方法删除。
在添加新的静态文本框以前,先看看Toolbox视图是否显示了,如果没有显示,在菜单栏上点击View->Toolbox即可。
Toolbox视图如下图:
Toolbox中列出了一些常用控件,其中有一个是StaticText,即是我们要添加的控件。
在Toolbox中的StaticText上点下鼠标左键不放开,并拖到IDD_ADDITION_DIALOG对话框模板上,模板上会出现一个虚线框,我们找到合适的位置松开鼠标左键放下它。
用鼠标左键选中控件后周围出现虚线框,然后鼠标移到虚线框上几个黑点的位置会变成双向箭头的形状,此时就可以按下鼠标左键并拖动来改变控件大小了。
我们可以这样改变新添加的静态文本框控件的大小,以更好的显示标题。
当然,整个对话框模板也可以用这种方法改变大小。
接下来就该修改静态文本框的文字了。
鼠标右键点击静态文本框,在右键菜单中选择“Properties”,Properties面板就会显示出来,在面板上修改Caption属性为“被加数”,ID修改为IDC_SUMMAND_STATIC。
此时模板如下图:
2.为对话框添加一个编辑框(EditControl),用来输入被加数。
添加编辑框的过程与静态文本框类似,在Toolbox中选中EditControl控件拖到对话框模板上,并使其与之前的静态文本框水平对齐(为了美观),然后调整其大小使之适合被加数的输入。
在编辑框上点右键,仍然在右键菜单中选择“Properties”显示出属性(Properties)面板,修改其ID为IDC_SUMMAND_EDIT。
此时模板如下图:
3.按照1的方法添加一个标题为“加数”的静态文本框,用于显示字符串--“加数”。
并将其ID改为IDC_ADDEND_STATIC。
4.按照2的方法添加一个ID为IDC_ADDEND_EDIT的编辑框,用来输入加数。
5.按照1的方法添加一个标题为“和”的静态文本框,用于显示文字--“和”。
并修改其ID为IDC_SUM_STATIC。
6.按照2的方法添加一个ID为IDC_SUM_EDIT的编辑框,用来显示最终的加和。
7.类似的添加按钮(Button)控件到对话框模板,用于在被点击后触发加法计算。
修改其标题为“计算”,ID为IDC_ADD_BUTTON。
到此,对话框模板如图:
8.删除OK按钮。
打开Cancel按钮的属性面板,将标题改为“退出”,并使其与“计算”按钮水平对齐。
9.根据控件的布局,适当调整整个对话框模板的大小,使其相对控件布局来说大小合适,界面美观。
这样在对话框模板中就把我们在本例中需要用到的控件就添加完了。
最终效果如下:
至此,我们的对话框资源就基本创建完了。
应用程序运行后的界面效果已经很清楚了。
后面鸡啄米会讲如何在对话框类中实现加法计算功能,并能很好的和界面交互。
二、VS2010/MFC编程:
创建对话框类和添加控件变量
生成对话框类主要包括新建对话框类、添加控件变量和控件的消息处理函数等。
因为例程Addition是基于对话框的程序,所以程序自动创建了对话框模板IDD_ADDITION_DIALOG,并自动生成了对话框类CAdditionDlg,它是从CDialogEx类派生的。
大家用过VC++6.0的可能记得,我们定义的对话框类都是从CDialog类派生的,但在VS2010中,一般对话框类都是继承自CDialogEx类。
创建对话框类
如果是自己新添加的对话框模板,怎样为它创建对话框类呢?
1.首先,在ResourceView的“Dialog”节点上右键,然后在右键菜单中选择“InsertDialog”创建一个新的对话框模板,ID就使用默认的IDD_DIALOG1。
2.在中间区域会显示新建的对话框模板,然后选中此对话框模板,点右键,在右键菜单中选择AddClass。
3.选择“AddClass”后会弹出一个对话框,在对话框中“Classname”下的编辑框中写入自定义的类名就可以了,例如CMyDialog。
4.最后点“Finish”完成。
最终你就可以在ClassView中看到新生成的对话框类CMyDialog了,并且在SolutionExplorer中有相应的MyDialog.h头文件和MyDialog.cpp源文件生成。
CMyDialog类同样派生于CDialogEx类。
注意,一般类名都以C打头,又比如,CTestDlg。
为对话框中的控件添加变量
在上一讲中为对话框添加了几个控件,包括三个静态文本框,三个编辑框,一个按钮控件。
程序自动生成的Cancel按钮保留,作为退出按钮,而OK按钮删除掉了。
静态文本框只是为了说明后面紧跟的编辑框中数据的意义,是被加数、加数还是和,所以它们是不会变的,我们就不为它们添加变量了。
按钮控件是用来操作的,这里也不为它们添加变量。
编辑框中的数据可能会经常变化,有必要为它们每个控件关联一个变量。
首先为被加数的编辑框IDC_SUMMAND_EDIT添加变量。
1.在编辑框上点右键,在右键菜单中选择“AddVariable”。
弹出添加成员变量的向导对话框。
2.我们想为其添加值变量而不是控件变量,所以对话框中“Category”下的组合框中选择Value。
3.“Variabletype”下的组合框此时默认选中的是“CString”,CString是字符串类,显然不能进行加法运算。
我们可以选择double、float、int等。
这里我们选择double,即编辑框关联一个double类型的变量。
4.在“Variablename”中写入自定义的变量名。
鸡啄米为其取名m_editSummand。
5.点“Finish”完成。
注意,类的成员变量名一般以m_打头,以标识它是一个成员变量。
参照此方法,再分别为加数的编辑框IDD_ADDEND_EDIT添加double型变量m_editAddend、和的编辑框IDD_SUM_EDIT添加double型变量m_editSum。
对话框类的数据交换和检验
在程序运行界面中,用户往往会改变控件的属性,例如,在编辑框中输入字符串,或者改变组合框的选中项,又或者改变复选框的选中状态等。
控件的属性改变后MFC会相应修改控件关联变量的值。
这种同步的改变是通过MFC为对话框类自动生成的成员函数DoDataExchange()来实现的,这也叫做对话框的数据交换和检验机制。
我们为三个编辑框添加了变量以后,在AdditionDlg.cpp中CAdditionDlg的DoDataExchange()函数的函数体中多了三条DDX_Text调用语句。
下面是函数体代码添加的注释。
C++代码
1.void CAdditionDlg:
:
DoDataExchange(CDataExchange* pDX)
2.{
3. // 处理MFC默认的数据交换
4. CDialogEx:
:
DoDataExchange(pDX);
5. // 处理控件IDC_SUMMAND_EDIT和变量m_editSummand之间的数据交换
6. DDX_Text(pDX, IDC_SUMMAND_EDIT, m_editSummand);
7. // 处理控件IDC_ADDEND_EDIT和变量m_editAddend之间的数据交换
8. DDX_Text(pDX, IDC_ADDEND_EDIT, m_editAddend);
9. // 处理控件IDC_SUM_EDIT和变量m_editSum之间的数据交换
10. DDX_Text(pDX, IDC_SUM_EDIT, m_editSum);
11.}
再以Addition程序为例简单说下数据交换机制。
如果我们在程序运行界面中输入被加数,则通过CAddition的DoDataExchange()函数可以将输入的值保存到m_editSummand变量中,反之如果程序运行中修改了变量m_editSummand的值,则通过CAddition的DoDataExchange()函数也可以将新的变量值显示到被加数的编辑框中。
但是这种数据交换机制中,DoDataExchange()并不是被自动调用的,而是需要我们在程序中调用CDialogEx:
:
UpdateData()函数,由UpdateData()函数再去自动调用DoDataExchange()的。
CDialogEx:
:
UpdateData()函数的原型为:
BOOLUpdateData(BOOLbSaveAndValidate=TRUE);
参数:
bSaveAndValidate用于指示数据传输的方向,TRUE表示从控件传给变量,FALSE表示从变量传给控件。
默认值是TRUE,即从控件传给变量。
返回值:
CDialogEx:
:
UpdateData()函数的返回值表示操作是否成功,成功则返回TRUE,否则返回FALSE。
在下一讲中将具体演示CDialogEx:
:
UpdateData()函数如何使用。
VS2010/MFC编程:
为控件添加消息处理函数
创建对话框类和添加控件变量在上一讲中已经讲过,这一讲的主要内容是如何为控件添加消息处理函数。
MFC为对话框和控件等定义了诸多消息,我们对它们操作时会触发消息,这些消息最终由消息处理函数处理。
比如我们点击按钮时就会产生BN_CLICKED消息,修改编辑框内容时会产生EN_CHANGE消息等。
一般为了让某种操作达到效果,我们只需要实现某个消息的消息处理函数。
一.添加消息处理函数
仍以前面的加法计算器的程序为例,说明怎样为“计算”按钮控件添加消息处理函数。
添加方法列出4种:
1.使用ClassWizard添加消息处理函数
用过的VC++6.0的朋友应该对ClassWizard很熟悉了,添加类、消息处理函数等经常会用到它,可以说是一个很核心的功能。
但从VS2002开始就见不到ClassWizard了,大部分功能都集成到对话框和控件等的属性中了,使用很方便。
到VS2010,久违的ClassWizard又回来了。
对于从VC++6.0直接转VS2010的朋友可能觉得还是使用ClassWizard比较习惯。
大家应该记得,“计算”按钮的ID为IDC_ADD_BUTTON,上图中Commands标签下,OjectIDs列表中有此ID,因为我们是想实现点击按钮后的消息处理函数,所以在Messages列表中选择BN_CLICKED消息,然后点右上方的AddHandler就可以添加BN_CLICKED消息处理函数OnClickedAddButton了。
当然你也可以改名,但一般用的默认的就可以。
2.通过“AddEventHandler...”添加消息处理函数
在“计算”按钮上点右键,然后在右键菜单中选择菜单项“AddEventHandler...”(中文:
添加事件处理程序),弹出“EventHandlerWizard”对话框,如下图:
可见“Messagetype”中默认选中的就是BN_CLICKED消息,函数名和所在类都已经自动给出,直接点“AddandEdit”就可以了。
3.在按钮的属性视图中添加消息处理函数
上面说过,从VS2002开始就主要从属性视图添加消息处理函数了。
我们在“计算”按钮上点右键,在右键菜单中选择“Properties”,右侧面板中会显示按钮的属性视图。
我们可以像上图中那样,点属性视图的“ControlEvents”按钮(类似闪电标志),下面列出了“计算”按钮的所有消息。
我们要处理的是BN_CLICKED消息,点其右侧空白列表项,会出现一个带下箭头的按钮,再点此按钮会出现“
4.双击按钮添加消息处理函数
最直接最简单的方法就是,双击“计算”按钮,MFC会自动为其在CAdditionDlg类中添加BN_CLICKED消息的处理函数OnBnClickedAddButton()。
二.在消息处理函数中添加自定义功能
在我们使用任意一种方法添加了消息处理函数以后,都只能得到一个空的OnBnClickedAddButton()函数的函数体,要实现我们想要的功能,还需要在函数体中加入自定义功能代码。
在加法计算器程序中,我们想要“计算”按钮实现的功能是,获取被加数和加数的数值,然后计算它们的和并显示到和的编辑框里。
那么,OnBnClickedAddButton()的函数体就应修改为:
C++代码
1.void CAdditionDlg:
:
OnBnClickedAddButton()
2.{
3. // TODO:
Add your control notification handler code here // 将各控件中的数据保存到相应的变量
4. UpdateData(TRUE);
5. // 将被加数和加数的加和赋值给m_editSum
6. m_editSum = m_editSummand + m_editAddend;
7. // 根据各变量的值更新相应的控件。
和的编辑框会显示m_editSum的值
8. UpdateData(FALSE);
9.}
鸡啄米在上面的代码中已经添加注释,大家应该很容易理解了。
对于UpdateData()函数的说明在上一讲中已经介绍过,如果忘了可以再回上一讲了解了解。
接下来我们运行下此应用程序。
在运行结果界面中,输入被加数5.1,加数2.3,然后点“计算”:
在上图中可以看到,点“计算”按钮后,和的编辑框中显示了正确结果:
7.4。
简单分析下运行过程:
输入被加数和加数,点“计算”按钮后产生点击消息,从而调用OnBnClickedAddButton()函数。
进入此函数后,首先由UpdateData(TRUE)函数将被加数的值5.1和加数的值2.3分别保存到变量m_editSummand和m_editAddend,然后通过语句m_editSum = m_editSummand + m_editAddend;计算出被加数和加数的和为7.4,并把7.4赋值给m_editSum。
最后调用UpdateData(FALSE)根据被加数、加数、和的值更新三个编辑框的显示值,就得到了上图中的结果。
到此,一个具有简单的加法运算功能的加法计算器应用程序就基本完成了。
如果大家想实现其他功能,可以修改控件资源和消息处理函数来练习下。
VS2010/MFC编程:
设置对话框控件的Tab顺序
本节主要讲对话框上控件的Tab顺序如何调整。
上一讲为“计算”按钮添加了消息处理函数后,加法计算器已经能够进行浮点数的加法运算。
但是还有个遗留的小问题,就是对话框控件的Tab顺序问题。
运行加法计算器程序,显示对话框后不进行任何操作,直接按回车,可以看到对话框退出了。
这是因为“退出”按钮是Tab顺序为1的控件,也就是第一个接受用户输入的控件。
但是按照我们的输入习惯,应该是被加数的编辑框首先接受用户输入,然后是加数编辑框,再接下来是“计算”按钮,最后才是“退出”按钮。
我们先来直观的看看各个控件的Tab顺序吧。
打开“ResourceView”视图,然后在资源中找到对话框IDD_ADDITION_DIALOG,双击ID后中间客户区域出现其模板视图。
在主菜单中选择“Format”->"TabOrder",或者按快捷键Ctrl+D,对话框模板上就会显示各个控件的Tab顺序数字。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 讲座 VSMFC 编程 对话框 加法 计算器