西安石油大学大二上C++面向对象程序设计课件第11章对话框及常用控件1213.docx
- 文档编号:24458724
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:84
- 大小:368.90KB
西安石油大学大二上C++面向对象程序设计课件第11章对话框及常用控件1213.docx
《西安石油大学大二上C++面向对象程序设计课件第11章对话框及常用控件1213.docx》由会员分享,可在线阅读,更多相关《西安石油大学大二上C++面向对象程序设计课件第11章对话框及常用控件1213.docx(84页珍藏版)》请在冰豆网上搜索。
西安石油大学大二上C++面向对象程序设计课件第11章对话框及常用控件1213
第11章对话框及常用控件
对话框在Windows程序中是用户和Windows程序交互的主要途径。
对话框操作简单方便,既可以是最简单的消息框,也可以是复杂的数据输入表单等。
控件是一种特殊的子窗口,通常用户是具体通过对话框中的各种控件来和Windows程序交互的。
本章主要内容包括:
对话框的创建、使用和销毁,模式对话框和无模式对话框的概念,对话框数据交换和验证机制,MFC通用对话框类、常用控件使用方法以及MFC简单数据类型使用方法。
11.1对话框的创建与使用
对话框是一个能接收消息的窗口,用户可以移动、缩放和关闭对话框。
在一个对话框中通常可以包含许多称为控件的元素,例如:
静态文本、编辑框、按钮、列表框、组合框、树形视图、以及进度指示器等。
MFC对这些控件进行了封装,同时提供对话框数据交换和校验机制,用来实现控件数据的初始化,以及从控件中获取用户的输入数据。
MFC中的CDialog类封装了Windows对话框的基本功能,是所有对话框的基类。
CDialog类是CWnd类的派生类,该类的定义在“afxwin.h”文件中。
11.1.1对话框的创建
创建和使用一个对话框的步骤一般包括:
(1)创建对话框资源;
(2)设置对话框及控件属性;
(3)创建对话框派生类;
(4)为控件添加成员变量;
(5)为控件添加消息处理函数;
(6)在程序中创建对话框派生类的对象;
(7)调用DoModal或Create显示对话框。
【例11.1】创建一个SDI类型的工程CompArea,要求添加菜单“计算”及其菜单项“三角形面积”,并为该菜单项添加函数体为空的命令消息处理函数。
操作步骤为:
1打开VisualC++集成开发环境,单击File|New菜单项,打开New对话框。
2在New对话框中选择Projects标签,选中MFCAppWizard(exe)类型,输入工程名为“CompArea”,本例的保存路径为“E\Samples”,单击“OK”按钮。
3在“MFCAppWizard-step1”对话框中选择“Singledocument”,其余步骤中均使用默认选项,生成一个SDI工程。
4在工作区中选择ResourceView标签,展开Menu项,在IDR_MAINFRAME上双击鼠标左键启动菜单资源编辑器。
5用鼠标将顶层菜单最右边的虚方框拖至“查看”和“帮助”之间。
在虚方框上双击鼠标左键,弹出MenuItemProperties对话框,在General标签的Caption编辑框中输入菜单标题:
计算(&C),其中“&”的作用是使其后的字符加上下划线,从而可以让用户用键盘来选择菜单。
Pop-up检查框默认选中,表明新加的菜单可以有其弹出的子菜单。
如图11.1所示。
图11.1添加新菜单
6将MenuItemProperties对话框左上角的“图钉”状按钮按下,使该对话框保持可见。
用鼠标左键单击“计算”菜单下的虚方框,在新显示的MenuItemProperties对话框中设置要添加的菜单项的属性。
如图11.2所示,设置ID为“ID_COMPUTER_TRIANGLE”,设置Caption为“三角形面积”。
图11.2添加菜单项“三角形面积”及设置属性
7在工具栏单击存盘图标(或者按Ctrl+S键)将资源文件ComputerArea.rc存盘,关闭菜单项属性窗口以及菜单编辑器窗口。
8选择View|ClassWizard…菜单项,弹出MFCClassWizard对话框,选择MessageMaps标签,在Classname组合框中选择视图类CCompAreaView,在ObjectIDs列表框中选择ID_COMPUTER_TRIANGLE,在Messages列表框中的COMMAND上双击鼠标左键,弹出AddMemberFunction对话框。
如图11.3所示。
图11.3添加菜单消息处理函数
9采用默认函数名OnComputerTriangle,单击OK按钮关闭AddMemberFunction对话框,返回MFCClassWizard对话框,在Memberfunctions列表框中可见新添加的成员函数OnComputerTriangle。
10在Memberfunctions列表框中的OnComputerTriangle函数名上双击,编译器自动关闭MFCClassWizard对话框,并在客户区打开CompAreaView.cpp文件,定位至OnComputerTriangle函数,此时该函数体为空。
11至此就完成了添加菜单“计算”及其菜单项“三角形面积”,并为该菜单项添加了函数体为空的命令消息处理函数OnComputerTriangle。
执行CompArea工程,可以测试“三角形面积”菜单命令。
【例11.2】为例11.1中的CompArea工程添加如图11.4所示的对话框资源,并进行对话框消息映射。
图11.4计算三角形面积对话框
操作步骤为:
1打开例11.1中的CompArea工程文件。
操作方法参见例10.3。
2在CompArea工程的工作区中选择ResourceView标签,在Dialog条目上单击鼠标右键,在弹出的快捷菜单中选择“InsertDialog”菜单命令。
3这时在Dialog条目下会增加一个标识号为IDD_DIALOG1的条目,同时在客户区显示该对话框资源,如图11.5所示。
说明:
如果在CompArearesources条目后出现一个*号,表明当前资源还未保存,最好要及时保存。
图11.5新建对话框资源
4在对话框资源上单击鼠标右键,在弹出的菜单中选择“Properties”菜单命令,弹出DialogProperties对话框,如图11.6所示。
图11.6设置对话框属性
5将对话框资源的ID设置为“IDD_AREA”,Caption设置为“计算三角形面积”。
关闭DialogProperties对话框。
6选中Ok和Cancel按钮,按键盘上的Delete键完成删除,再为对话框添加如表11.1所示的控件,并设置相应属性。
表11.1对话框控件属性
控件类型
控件ID
控件Caption
CStatic
IDC_STATIC
第一个边:
IDC_STATIC
第二个边:
IDC_STATIC
第三个边:
IDC_STATIC
第三个边:
CEdit
IDC_SIDE1
无
IDC_SIDE2
IDC_SIDE3
IDC_AREA
CButton
IDC_TRIANGLE_AREA
计算
IDC_RESET
重置
具体方法为:
在Control工具栏中选择控件类型,用鼠标左键拖至对话框中适当位置后松开鼠标(或者用鼠标左键选中后再在对话框中单击)。
然后在控件上用鼠标右击打开属性对话框,按照表11.1设置相应属性。
最后,利用Dialog工具栏对各个控件进行如图11.7所示的布局。
图11.7对话框资源
注意:
对IDC_AREA编辑框,还要在属性对话框的Style标签中选中“Read-only”检查框,使其不可编辑。
可使用Dialog工具栏最左边的Test按钮测试对话框效果。
(如果看不到所需工具栏,可在菜单栏和工具栏的空白处右击鼠标,在弹出的快捷菜单中进行选择。
)
将所需控件在对话框中添加完成后,也即资源创建完毕。
此时需要创建一个CDialog类的派生类与该资源关联,下面的步骤7到步骤9完成此项工作。
7在对话框资源上双击鼠标左键(或者单击鼠标右键,在弹出的菜单中选择ClassWizard…菜单项,或者选择View|ClassWizard…菜单项),会弹出MFCClassWizard对话框,并紧接着弹出AddingaClass对话框,如图11.8所示。
图11.8AddingaClass对话框
8在AddingaClass对话框确认默认选项Createanewclass,单击OK按钮,弹出NewClass对话框,如图11.9所示。
图11.9Newclass对话框
9在Name编辑框中输入“CMyDlg”,其余设置取默认值,单击OK按钮。
此时自动生成该类的头文件和源文件分别为“MyDlg.h”和“MyDlg.cpp”。
10此时在MFCClassWizard对话框的ObjectIDs列表框和Classname项中默认值都为CMyDlg。
选择MemberVariables标签,在ControlIDs列表框中选中IDC_SIDE1,单击AddVariable…按钮,弹出AddMemberVariable对话框,如图11.10所示。
图11.10AddMemberVariable对话框
11为IDC_SIDE1控件设置成员变量名为m_fSide1,在Category组合框中选择“Value”类型,在Variabletype组合框中选择“float”数据类型,单击OK按钮。
此时会在MemberVariables标签下部出现对该成员变量设置取值范围,当用户进行输入数据时系统会自动进行数据的有效性验证,若不满足条件会进行提示。
12同样方法按照表11.2为其余编辑框控件设置相应的成员变量。
表11.2编辑框控件的成员变量属性
控件ID
成员变量名
变量类型
IDC_SIDE1
m_fSide1
float
IDC_SIDE2
m_fSide2
float
IDC_SIDE3
m_fSide3
float
IDC_AREA
m_dArea
double
此时,系统自动在CMyDlg类的构造函数中对这4个成员变量进行初始化,初始化数值均为0.0。
13选择MessageMaps标签,为两个按钮添加消息处理函数。
在ObjectIDs列表框中选中“IDC_TRIANGLE_AREA”,在Messages列表框中选中“BN_CLICKED”,单击“AddFunction…”按钮,弹出AddMemberFunction对话框,如图11.11所示。
图11.11为“计算”按钮添加消息处理函数
14使用默认成员函数名OnTriangleArea,单击OK按钮。
15在ObjectIDs列表框中选择“IDC_RESET”,以同样方法为“重置”按钮添加消息处理函数OnReset。
单击OK按钮关闭MFCClassWizard对话框。
16在工作区选择ClassView标签,展开CMyDlg类,双击“OnTriangleArea()”,编译器自动在客户区打开MyDlg.cpp文件,并且定位到CMyDlg:
:
OnTriangleArea()函数的开头处。
在MyDlg.cpp文件头部增加:
#include
voidCMyDlg:
:
OnTriangleArea()
{//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData();
if(m_fSide1+m_fSide2>m_fSide3&&m_fSide1+m_fSide3>m_fSide2
&&m_fSide3+m_fSide2>m_fSide1)//判断能否构成三角形
{
floats=(m_fSide1+m_fSide2+m_fSide3)/2;
m_dArea=sqrt(s*(s-m_fSide1)*(s-m_fSide2)*(s-m_fSide3));//计算三角形面积
CStringstr;
str.Format("%.2f",m_dArea);//保留两位小数
m_dArea=atof(str);//使用atof函数将字符串转换为符点数
UpdateData(FALSE);//更新对话框中的数据
}
else
{
AfxMessageBox("无法构成三角形,请重新输入!
");
}
}
17以同样方法为CMyDlg:
:
OnReset()函数增加代码如下:
voidCMyDlg:
:
OnReset()
{//TODO:
Addyourcontrolnotificationhandlercodehere
m_fSide1=0;
m_fSide2=0;
m_fSide3=0;
m_dArea=0;
UpdateData(FALSE);//更新对话框中的数据
}
18在MyDlg.h文件开头部分添加下面的包含语句:
#include
19执行CompArea工程,测试程序运行效果。
至此,与对话框资源相关的类及成员已经创建完成,下面就可以通过该对话框类的对象显示和使用对话框了。
11.1.2对话框的使用
对话框分为模式对话框和无模式对话框两种。
从用户的观点看,模式对话框显示时,用户不能在同一个应用程序的其他地方做其他操作,直到该对话框关闭。
通常使用的对话框大部分是模式对话框,例如文件“打开/另存为”对话框;无模式对话框显示时,用户可以操作其他界面对象,例如主窗口、菜单、工具栏等,以及常用的Word应用程序中的“查找和替换”对话框、“符号”对话框等都是无模式对话框。
当需要创建一个对话框时,必须确定该对话框是模式对话框还是无模式对话框,二者的显示方法是不同的。
在程序中创建对话框对象后,可以调用DoModal函数或ShowWindow函数显示对话框。
而在对话框显示之前,系统会调用虚函数CDialog:
:
OnInitDialog对对话框进行初始化。
因此,这个函数通常会在派生类中被扩充继承,用户可以加入一些自己的初始化工作。
在CDialog:
:
OnInitDialog函数中会执行CWnd:
:
UpdateData(FALSE)函数,完成用对话框成员变量的值去初始化对话框。
当用户向对话框控件输入数据后,必须调用UpdateData()函数将控件中的数据传递给相应的成员变量。
(1)模式对话框
模式对话框是最常使用的对话框。
当模式对话框打开时,将建立自己的消息循环,使得用户只能与该对话框进行交互,其他的用户界面对象接收不到输入信息,也不会做出任何响应。
模式对话框的显示是通过调用CDialog:
:
DoModal函数实现的,当对话框关闭后该函数才返回,该函数原型为:
virtualintDoModal();
返回值为IDOK时表示用户单击了OK按钮,此时系统先调用该按钮消息处理函数OnOK,然后DoModal函数才返回;返回值为IDCANCEL时表示用户单击了对话框窗口的关闭按钮或者Cancel按钮,此时系统先调用该按钮消息处理函数OnCancel,然后DoModal函数才返回。
通常有两种对话框对象创建方式:
一种是在视图类头文件中创建为成员变量。
另一种是在视图类的成员函数中临时创建。
【例11.3】为例11.2的CompArea工程的菜单命令“计算|三角形面积”添加处理代码,使例11.2中创建的对话框作为模式对话框进行显示,获取用户输入的三个边长并计算三角形面积后输出。
操作步骤为:
1在工作区选择ClassView标签,展开CCompAreaView类,双击成员函数OnComputerTriangle(),编译器自动在客户区打开“CompAreaView.cpp”文件,并定位到CCompAreaView:
:
OnComputerTriangle()函数开头处。
2为OnComputerTriangle()函数添加代码如下:
voidCCompAreaView:
:
OnComputerTriangle()
{//TODO:
Addyourcommandhandlercodehere
CMyDlgmydlg;//创建对话框对象
mydlg.DoModal();//显示模式对话框
}
3在CompAreaView.cpp文件开头部分添加下面的包含语句:
#include"MyDlg.h"
4编译,链接和运行程序,测试“计算|三角形面积”菜单项功能及模式对话框的效果。
如图11.12所示。
图11.12CompArea工程执行结果
这个例子中,对话框对象mydlg的生存周期仅限于成员函数CCompAreaView:
:
OnComputerTriangle中。
当该函数结束时,系统将自动调用CMyDlg类的析构函数删除mydlg对象。
(2)无模式对话框
当无模式对话框打开时,将和应用程序共用一个消息循环,此时用户既可以和该对话框进行交互,也可以选择其它用户界面后和其他对象进行交互。
无模式对话框需要调用CDialog:
:
Create函数动态创建,如果对话框资源具有Visiable风格,则对话框可立即显示出来,否则需要调用CWnd:
:
ShowWindow(SW_SHOW)函数来显示该对话框,当对话框显示后Create函数立即返回。
在CDialog类定义中,Create函数原型为:
BOOLCreate(LPCTSTRlpszTemplateName,CWnd*pParentWnd=NULL);
BOOLCreate(UINTnIDTemplate,CWnd*pParentWnd=NULL);
参数:
♦lpszTemplateName为以NULL结束的字符串,表示对话框资源名。
♦nIDTemplate为对话框资源ID号。
♦pParentWnd为指向对话框所属父窗口对象指针,缺省值为NULL,表示对话框对象的父窗口设置为主程序窗口。
返回值:
若对话框创建和初始化成功,则返回非0值,否则返回0。
【例11.4】为例11.3中的CompArea工程添加一个无模式对话框类型的输出信息对话框,如图11.13所示,当用户在计算三角形面积时用来显示每次的计算信息。
图11.13输出信息对话框
操作步骤:
1在VisualC++中打开“CompArea.dsw”文件,使用对话框资源编辑器添加对话框资源(方法同例11.2的步骤2至步骤4),设置ID为“IDD_OUTPUTINFO”,设置Caption为“输出信息”。
2删除OK按钮和Cancel按钮。
3添加一个列表框控件,ID为“IDC_INFOLIST”,在属性对话框的Style标签中选择Horizontalscroll、Verticalscroll,不选Sort,其余使用默认设置。
4在对话框资源上双击鼠标左键(或者单击鼠标右键,在弹出的菜单中选择ClassWizard…),会弹出MFCClassWizard对话框,并紧接着弹出AddingaClass对话框,如图11.8所示。
5在AddingaClass对话框确认默认选项Createanewclass,单击OK按钮,弹出NewClass对话框,如图11.14所示。
在Name编辑框中输入“CInfoDialog”,基类为CDialog,其余设置取默认值,单击OK按钮。
系统自动生成头文件和源文件为“InfoDialog.h”和“InfoDialog.cpp”。
图11.14Newclass对话框
6在MFCClassWizard对话框中,选择MemberVariables标签,为对话框中的列表框控件在CInfoDialog类中添加相关联的成员变量m_OutputInfo,在Category组合框中选择“Control”类型,在Variabletype组合框中选择“CListBox”类型,如图11.15所示。
图11.15添加ListBox控件成员变量
7单击AddMemberVariable对话框的OK按钮,再单击MFCClassWizard对话框的OK按钮。
当用户在“计算三角形面积”对话框中单击“计算”按钮时,应该显示“输出信息”对话框,并在列表框中显示计算信息。
因此需要在“计算”按钮的消息处理函数CMyDlg:
:
OnTriangleArea()中添加代码实现具体功能。
8在工作区中选择ClassView标签,在CMyDlg条目上双击打开“MyDlg.h”文件,在开头部分添加包含语句:
#include"InfoDialog.h"
在类的定义中添加析构函数声明和成员变量:
public:
~CMyDlg();
CInfoDialog*m_pInfodlg;//定义输出信息对话框对象指针
9展开CMyDlg类,双击构造函数,编译器自动在客户区打开“MyDlg.cpp”文件,并定位到CMyDlg:
:
CMyDlg()函数开头处。
添加代码如下:
m_pInfodlg=NULL;//初始化输出信息对话框对象指针
10编辑析构函数CMyDlg:
:
~CMyDlg(),添加代码如下:
CMyDlg:
:
~CMyDlg()
{
if(m_pInfodlg!
=NULL)
{
deletem_pInfodlg;//释放输出信息对话框对象指针
}
}
11编辑CMyDlg:
:
OnTriangleArea()函数,添加代码如下:
voidCMyDlg:
:
OnTriangleArea()
{//TODO:
Addyourcontrolnotificationhandlercodehere
if(m_pInfodlg==NULL)
{
m_pInfodlg=newCInfoDialog;//使用new运算符申请对话框对象
m_pInfodlg->Create(IDD_OUTPUTINFO,NULL);//创建无模式对话框
}
m_pInfodlg->ShowWindow(SW_SHOW);//显示无模式对话框
//设置列表框水平滚动宽度为1000像素
m_pInfodlg->m_OutputInfo.SetHorizontalExtent(1000);
UpdateData(TRUE);//将控件中的数据传递给相应的变量
if(m_fSide1+m_fSide2>m_fSide3&&m_fSide1+m_fSide3>m_fSide2
&&m_fSide3+m_fSide2>m_fSide1)//判断能否构成三角形
{
floats=(m_fSide1+m_fSide2+m_fSide3)/2;
m_dArea=sqrt(s*(s-m_fSide1)*(s-m_fSide2)*(s-m_fSide3));//计算三角形面积
CStringtemp;
temp.Format("%.2f",m_dArea);//保留两位小数
m_dArea=atof(temp);//使用atof函数将字符串转换为符点数
UpdateData(FALSE);//在控件中显示计算结果
CStringstrInfo;
strInfo.Format("第一条边:
%f,第二条边:
%f,第三条边:
%f,面积:
%f",m_fSide1,m_fSide2,m_fSide3,m_dArea);//格式化计算信息
//向模式对话框中添加计算信息
m_pInfodlg->m_Ou
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安石油 大学 大二 C+ 面向 对象 程序设计 课件 11 对话框 常用 控件 1213