教学材料《Visual C++程序》-第3章-2_第1页
教学材料《Visual C++程序》-第3章-2_第2页
教学材料《Visual C++程序》-第3章-2_第3页
教学材料《Visual C++程序》-第3章-2_第4页
教学材料《Visual C++程序》-第3章-2_第5页
已阅读5页,还剩422页未读 继续免费阅读

下载本文档

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

文档简介

3.5常用控件

根据控件的使用情况将控件分为两种类型:常用控件和高级控件。常用控件包括:静态控件、按钮、滚动条、编辑框、列表框和组合框6种控件,高级控件包括:上下控件、滑标控件、工具栏、状态栏、工具提示控件以及多文本编辑框等,这里重点介绍常用控件,表3.6列出了经常用到的控件类。图3.28用到的控件有静态图片控件、按钮、静态控件、编辑框、组合框、滚动条等。下一页返回3.5常用控件3.5.1静态控件静态控件是用于显示一个字符、框、矩形、图标、位图或增强的图元文件,它可以用做标签、框或用于分隔其他的控件。一个静态控件一般不接受用户输入,也不产生通知消息。在对话框编辑器的控件工具栏中,属于静态控件的有:静态文本(StaticText)、组框(GroupBox)、图片控件(Picture)三种。静态图片控件的General和Style选项卡如图3.29和图3.30所示。表3.7列出了其一般属性和风格的各个项的意义。可以选择Type(图片类型)、Image(图像资源)两个组合框中的有关选项内容,并可将应用程序资源中的图标、位图等内容显示在该静态图片控件中。另外,用户还可设置其风格来改变控件的外观以及图像在控件的位置等,如表3.8所示的Styles风格。上一页下一页返回3.5常用控件[例3.7]将一个.bmp图形显示在静态图片控件上(1)创建一个单文档(SDI)应用程序,名为:图片控件。(2)创建对话框模板:选择Insert→Resource命令,选中Dialog,单击New按钮。(3)将图片控件Picture拖到对话框上,并拉大些,将OK和CANCEL拖到下面。(4)向项目中插入一个.bmp图片:选择Insert→Resource命令,选中Bitmap,单击Import按钮,在弹出的ImportResource对话框中下拉出“所有文件(*.*)”,用“搜索”找到一个.bmp图形,将Import导入到此项目中。上一页下一页返回3.5常用控件(5)将这个图片放到图片控件上:在对话框上选中这个图片控件,右击此图片控件,弹出PicturePropertiec对话框(图片控件属性框),在Type下拉列表框中选择Bitmap,在image下拉列表框中选择IDB_BITMAP1,关闭属性对话框,就把图片加到了图片控件上。(6)为对话框添加类:双击新建对话框的任何位置,单击OK按钮,类名写:CMyDlg。(7)创建一个菜单项,用来显示对话框:在ResourceView选项卡打开Menu文件夹,选择IDR_MAINFRAME,双击空白菜单,取消选中Pop-up(将其√去掉,不选中),在ID处写:ID_DLG,菜单名写:显示图片对话框(&S),关闭。上一页下一页返回3.5常用控件

(8)在视图类的头文件CMyView.h的前面加:#include“MyDlg.h”。在该头文件的public下加:CMyDlg*dlg;。(9)将菜单命令(ID_DLG)映射到视图类CMyView中去,在该消息映射函数中添加代码:CMyView::OnDlg(){dlg=newCMyDlg(this);dlg->Create(IDD_DIALOG1);dlg->ShowWindow(SW_RESTORE);}

说明:SW_RESTORE是用原来的大小和位置显示一个窗口,同时令其进入活动状态。上一页下一页返回3.5常用控件(10)编译运行,如图3.31所示。如果直接建立一个对话框应用程序,在其上加一个图片控件,再通过选择Insert→Resource命令,选择Bitmap,单击Import按钮,插进一个位图(.bmp)图形,通过图片控件的属性将这个图形加在这个图片控件上,运行程序,在对话框上就能直接显示了。上一页下一页返回3.5常用控件3.5.2按钮控件按钮控件在进行可视化程序设计中经常用到,它是实现一种开与关的输入。1.常见的三类按钮控件(1)按键按钮:按键按钮通常可以立即产生某个动作,执行某个命令,因此也常被称为命令按钮。如果将其属性设定为Defaultbutton,这时它就有个黑边框,随之称为默认按钮,如图3.32所示的“默认按钮”,表示其已接受到键盘的输入焦点,只要按回车键就能按下这个按钮。一般只把最常用的按键设定为默认按键按钮上一页下一页返回3.5常用控件

(2)单选按钮:其外形为按钮文本和其左侧一个小圆圈,当它被选中时,就标上一个黑点,它可分为一般和自动两种类型。若是自动类型,选中同组按钮的某个单选按钮,则其余的单选按钮的选中状态就会清除,保证多个选项始终只有一个被选中,如图3.32上的Radio1所示。(3)复选框:其外形是在文本前有一个空心方框,当它被选中时,就加上一个“√”标记,通常复选框只有选中和未选中两种状态,若其中有一个灰色“√”,则这样的复选框是三态复选框,如图3.32所示的Check3,它表示复选框的选择状态是“不确定”。设定三态复选框的方法是在其属性的Style页面选中“Tri-state(状态)”项。上一页下一页返回3.5常用控件

常见的按钮映射消息有两个:①BN_CLICKED(单击按钮);②BN_DOUBLECLICKED(双击按钮)。3.按钮选中操作最常用的按钮操作是设置或获取一个按钮或多个按钮的选中状态。CButton类的以下两个成员函数原型如下:

voidSetCheck(intnCheck);//设置指定按钮的选中状态

intGetCheck()const;//获取指定按钮的选中状态其中,参数nCheck和函数GetCheck返回的值可以是:0表示不选中,1表示选中,2表示不确定(仅用于三态按钮)。上一页下一页返回3.5常用控件

而对于同组多个单选按钮的选中状态的设置或获取,需要使用CWnd类的成员函数:CheckRadioButton和GetCheckedRadioButton,它们的原型如下:

voidCheckRadioButton(intnIDFirstButton,intnIDLastButton,intnIDCheckButton);intGetCheckedRadioButton(intnIDFirstButton,intnIDLastButton);参数:

nIDFirstButton和nIDLastButton分别指定这组单选按钮的第一个和最后一个按钮ID值;

nIDCheckButton用于指定要设置选中状态的按钮ID值。上一页下一页返回3.5常用控件4.按钮控件的应用举例[例3.8]使用复选框(1)创建一个基于对话框的应用程序,名为:复选框。(2)将3个复选框和1个编辑框拖到对话框上,将编辑框拉长一些,并摆放整齐。对话框编辑器会将复选框的题注默认为Check1、Check2、Check3,如图3.33所示。(3)用ClassWizard在CMyDlg类为编辑框IDC_EDIT1加String类型的成员变量:m_text。(4)将这3个复选框的映射消息加到类CMyDlg,并添加代码:

voidCMyDlg::OnCheck1(){ m_text="选中复选框1"; UpdateData(false);}上一页下一页返回3.5常用控件voidCMyDlg::OnCheck2(){ m_text="选中复选框2"; UpdateData(false);}voidCMyDlg::OnCheck3(){ m_text="选中复选框3"; UpdateData(false);}(5)编译运行,如图3.34所示。可见,复选框被单击之后,自动地在被选中和不选中之间切换(在编辑框显示程序中写入变量m_text中的信息),能够在任何时候决定复选框的状态,方法是将一个成员变量连接到复选框并使用GetCheck对象方法。上一页下一页返回3.5常用控件[例3.9]使用单选按钮(1)创建一个基于对话框的应用程序,名为:单选按钮。(2)拖过3个单选按钮和1个编辑框,把编辑框拉长一些,并摆放整齐。对话框编辑器也将给定单选按钮题注Radio1、Radio2、Radio3,当然可以更改它们。(3)用ClassWizard为编辑框IDC_EDIT1加一个成员变量:m_text1,并将Radio1、Radio2、Radio3映射到CMyDlg中,并添加代码:上一页下一页返回3.5常用控件voidCMyDlg::OnRadio1(){m_text1="你选择了第一个单选按钮";UpdateData(false);}voidCMyDlg::OnRadio2(){m_text1="你选择了第二个单选按钮";UpdateData(false);}voidCMyDlg::OnRadio3(){m_text1="你选择了第三个单选按钮";UpdateData(false);}上一页下一页返回3.5常用控件(4)编译运行,如图3.35所示。注意:当选中其中一个单选按钮时,没有办法再选中其他单选按钮,这是因为这3个单选按钮已经被当作了一个整体,它们都位于同一个窗口里,当单击了一个单选按钮之后,程序将自动将其他的单选按钮改为不选。如果想在同一窗口的多个单选按钮中,选中一个后还可以选中其他,那就得将多个单选按钮分成组,每一组的单选按钮用组框围起来,然后将每组的第一个单选按钮的属性的Group选中,置成“√”,这样就可以在同一窗口的不同单选按钮中,同时选中多个。步骤再从(5)往下做。上一页下一页返回3.5常用控件

(5)再为对话框添加3个单选按钮(Radio4、Radio5、Radio6)和1个编辑框(EDIT2),然后拖过一个组框(GroupBox),将这3个单选按钮和编辑框用组框围起来。打开组框的属性对话框,将标题写成“第二组单选按钮”。再拖过一个组框(GroupBox),将原来的3个单选按钮(Radio1、Radio2、Radio3)和一个编辑框(EDIT1)用组框围起来。打开组框的属性对话框,将标题写成“第一组单选按钮”。上一页下一页返回3.5常用控件

(6)打开第一组第一个单选按钮Radio1的General属性,单击Group将其置成“√”。打开第二组第一个单选按钮Radio4的General属性,单击Group将其置成“√”。(7)为编辑框EDIT2用ClassWizard添加一个成员变量:m_text2。(8)为3个单选按钮IDC_RADIO4、IDC_RADIO5、IDC_RADIO6添加映射消息,并添加下列代码:上一页下一页返回3.5常用控件voidCMyDlg::OnRadio4(){m_text2="你选中了单选按钮4";UpdateData(false);}voidCMyDlg::OnRadio5(){m_text2="你选中了单选按钮5";UpdateData(false);}voidCMyDlg::OnRadio6(){m_text2="你选中了单选按钮6";UpdateData(false);}上一页下一页返回3.5常用控件

(9)编译运行,分别选中一组和二组中的单选按钮,出现如图3.36所示的结果。[例3.10]复选框和单选按钮混用为花店设计一个小程序,允许顾客选择某一行花或者该行花中的许多支花。当用户选中一个相应于特殊排列的单选按钮时,程序将显示该排列里面各种各样的花(复选框)来供顾客继续选择,并且将在一个文本框里显示花的价格;当顾客选中另一单选按钮,程序应显示新一排列类型中的花,并给出该排列花的价格。上一页下一页返回3.5常用控件

(1)创建一个基于对话框的应用程序,名为:鲜花选择。(2)向对话框添加两个组合框,如图3.37所示。组合框能可视并有效地安排控件,特别是同一组框中的单选按钮具有一致的功能,因此能在程序中安排许多相互独立的单选按钮组。(3)右击组框,在弹出的快捷菜单中选择Properties(属性)命令,然后在Caption框中输入新的题注;这里将左边的组框设为:花的排列;右边的组设为:花的名字。上一页下一页返回3.5常用控件

(4)向“花的排列”组中添加4个单选按钮,分别将题注改为:一排、二排、三排、四排;向“花的名字”组中添加4个复选框,分别将题注改为:山茶花、玫瑰花、百合花、腊梅花,如图3.38所示。能让顾客使用单选按钮选取一个花排列,并使用复选框指出哪些花位于哪个排列中。(5)用ClassWizard在CMyDlg类中为4个复选框添加BOOL类型的成员变量,如图3.39所示:IDC_CHECK1为m_check1,CHECK2为m_check2,IDC_CHECK3为m_check3,IDC_CHECK4为m_check4,如图3.40所示。上一页下一页返回3.5常用控件

(6)向对话框中添加一个编辑框EDIT1,并用ClssWizard为其添加一个String类型的成员变量m_text。(7)用ClassWizard将映射消息IDC_RADIO1、IDC_RADIO2、IDC_RADIO3、IDC_RADIO4连接到CMyDlg类的单选按钮控件。并在voidCMyDlg::OnRadio1()前面定义整型变量n,再为各单选按钮消息添加代码:上一页下一页返回3.5常用控件intn=0;//n用于确定是第几排的voidCMyDlg::OnRadio1(){n=1;m_check1=true;m_check2=true;m_check3=true;m_check4=true;m_text="有4种花出售";UpdateData(false);上一页下一页返回3.5常用控件voidCMyDlg::OnRadio2(){n=2;m_check1=true;m_check2=false;m_check3=true;m_check4=false;m_text="有2种花出售";UpdateData(false);}上一页下一页返回3.5常用控件voidCMyDlg::OnRadio3(){n=3;m_check1=false;m_check2=true;m_check3=false;m_check4=true;m_text="有2种花出售";UpdateData(false);}上一页下一页返回3.5常用控件voidCMyDlg::OnRadio4(){n=4;m_check1=true;m_check2=true;m_check3=true;m_check4=false;m_text="有3种花出售";UpdateData(false);}上一页下一页返回3.5常用控件

(8)编译运行,选中“一排”单选按钮,有4种花出售,编辑框写:有4种花出售,如图3.41所示。选中“二排”单选按钮,有两种花出售,如图3.42所示。还有三排、四排可试试看。(9)再用ClassWizard将映射消息IDC_CHECK1、IDC_CHECK2、IDC_CHECK3、IDC_CHECK4连接到CMyDlg类的复选框控件,并添加代码:上一页下一页返回3.5常用控件voidCMyDlg::OnCheck1(){if(n==3||n==0) {m_text=""; m_check1=false;m_check2=false;m_check3=false;m_check4=false;UpdateData(false);return; }上一页下一页返回3.5常用控件m_text="(价格)Price:$100.00";m_check1=true;m_check2=false;m_check3=false;m_check4=false; UpdateData(false);}上一页下一页返回3.5常用控件voidCMyDlg::OnCheck2(){if(n==2||n==0) {m_text=""; m_check1=false; m_check2=false; m_check3=false; m_check4=false; UpdateData(false);return; }上一页下一页返回3.5常用控件m_text="(价格)Price:$110.00";m_check1=false;m_check2=true;m_check3=false;m_check4=false;UpdateData(false);}上一页下一页返回3.5常用控件voidCMyDlg::OnCheck3(){if(n==3||n==0) {m_text=""; m_check1=false; m_check2=false; m_check3=false; m_check4=false; UpdateData(false);return; }上一页下一页返回3.5常用控件m_text="(价格)Price:$130.00";m_check1=false;m_check2=false;m_check3=true;m_check4=false;UpdateData(false);}上一页下一页返回3.5常用控件voidCMyDlg::OnCheck4(){if(n==4||n==2||n==0) {m_text="";m_check1=false;m_check2=false;m_check3=false;m_check4=false;UpdateData(false);return; }上一页下一页返回3.5常用控件m_text="(价格)Price:$150.00";m_check1=false;m_check2=false;m_check3=false;m_check4=true;UpdateData(false);}上一页下一页返回3.5常用控件

(10)编译运行,选中某一排后再选中每一种花,每一种花的价钱都显示在编辑框里;选中“二排”只有“山茶花”、“百合花”,分别选中它们,出现各自的价钱;而选中“玫瑰花”、“腊梅花”却不出现它们的价钱,因为在这一排没有这两种花,这就是程序中变量n所起的作用。例如:在voidCMyDlg::OnRadio3()函数中定义n=3,那么当选中“三排”(Radio3)时,“山茶花”和“百合花”就不被选中,也就是没有这两种花,而选中“山茶花”(OnCheck1),就到消息函数CMyDlg::OnCheck1()中,其中第一条语句就判别n是否等于3,如果等于3,将m_text变量置空返回,不执行下面语句,也就是不显示价钱;在CMyDlg::OnCheck3()中也是这样判别的,因为这两种花在三排里也没有,所以都不显示价钱。CMyDlg::OnCheck2()、CMyDlg::OnCheck4()函数中的if判别都是这个道理。上一页下一页返回3.5常用控件3.5.3编辑框控件编辑控件(EditBox)的主要作用在于接收用户键盘输入,通过它可以很方便地输入各种文本,数字或者口令,也可以用它编辑和修改文本的内容。编辑框里的文本可以是单行,也可以是多行,由其属性Multiline决定。多行编辑具有简单文本编辑器的常用功能,例如它可以有滚动条,换行用Ctrl+Enter组合键,还可以进行复制、粘贴等操作。单行编辑仅用于单行文本的显示和操作。当编辑框控件被激活并具有输入焦点时,会出现一个闪动的插入符,表明当前插入点的位置。上一页下一页返回3.5常用控件1.编辑框的属性编辑框的属性Styles(风格)选项卡如图3.43所示,表3.9列出了Styles的各项含义。2.编辑框的通知消息当编辑框的文本修改或者被滚动时,会向其父窗口发送一些通知消息,如表3.10所示。3.编辑框的基本操作为了能让编辑框控件允许不同类型数据的输入和读取,用户需要使用DDV和DDX技术。DDX将控件的成员变量同对话框类控件相连接,这样使得数据在控件之间很容易传输;DDV用于数据的校验。上一页下一页返回3.5常用控件(1)密码设置密码设置就是把编辑框设置成一个可输入密码的输入框。这时,用户输入的每个字符都被一个特殊的字符代替显示,这个特殊的字符称为密码字符。打开编辑框的属性对话框的Styles选项卡,选中Password复选框就将编辑框设置成一个可输入密码的输入框。默认的密码字符是“*”,应用程序可以使用成员函数CEdit::SetPassWordChar来定义自己的密码字符,该函数原型如:voidSetPasswordChar(TCHARch)。参数:ch表示设定的密码字符,当ch=0时,编辑框控件内将显示实际字符。上一页下一页返回3.5常用控件[例3.11]设置密码

1)创建一个多文档(或单文档)应用程序,名为:设置密码。

2)插入一个对话框,将ID改为:IDD_PASSWORD_DIALOG,Caption(标题)写:设置密码,将OK和CANCEL改为确定和取消。

3)按图3.44的布局布置控件。①拖入一个静态文本(StaticText),标题写:请输入用户名,并拖入一个编辑控件,将其ID改为:IDC_PASSWORD_EDIT1,在Styles中选中PassWord属性。②再拖入一个静态文本,标题写:请输入密码,拖入一个编辑控件,将其ID改为:IDC_PASSWORD_EDIT2,在Styles中选中PassWord属性。上一页下一页返回3.5常用控件4)创建对话框类,名为:CPassWordDialog。

5)加成员变量:为对话框类(Classname处为CPassWordDialog)的编辑框控件IDC_PASSWORD_EDIT1和IDC_PASSWORD_EDIT2加String类型的成员变量m_password1和m_password2,在MaximumCharacters处写20(字符串个数最多为20)。

6)在应用程序“设置密码.cpp”的InitInstance()函数中添加代码:上一页下一页返回3.5常用控件BoolCMyApp::InitInstance()

{m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();CPassWordDialogCDlg;if(CDlg.DoModal()==IDOK)//用户单击了"确定"按钮

{if(CDlg.m_password1!="nanshan")//用户名

{AfxMessageBox("用户名错误,确定后将退出程序");returnFALSE;}上一页下一页返回3.5常用控件if(CDlg.m_password2!="1949")//密码

{AfxMessageBox("密码错误,确定后将退出程序");returnFALSE;}}else//如果单击"取消"按钮程序也结束

returnFALSE; returnTRUE;}7)在应用程序“设置密码.cpp”头部加:#include“PassWordDialog.h”。8)编译运行,结果如图3.44所示。上一页下一页返回3.5常用控件(2)选择文本用户可以在程序运行过程中选择编辑框中的文本,以便对选择的文本进行处理。这时用户可以用鼠标或键盘来选择文本。用鼠标选择文本的方法是:在要选择的文本的一端按住鼠标左键并拖动鼠标,到另一端释放鼠标键;用键盘选择文本的方法是:在按光标方向移动键的同时按住Shift键。在应用程序中也可以通过编程选择文本,这时需要通过调用成员函数CEdit::SetSel来实现。这个函数确定了编辑框内文本的选择范围,与该函数相应的还有CEdit::GetSel和CEdit::ReplaceSel,它们分别用来获取编辑框控件中前一选择的开始和结束的位置以及替代被选择的文本。上一页下一页返回3.5常用控件(3)只读设置只读设置就是把编辑框设置成一个只读的编辑框,这时该编辑框只能读,不能输入和修改。设置的方法是打开编辑框的属性对话框的Styles选项卡,选中Read-only复选框就将编辑框设置成一个只读的编辑框。也可以通过编程来实现编辑框的只读设置,需要调用成员函数CEdit::SetReadOnly来实现,该函数的原型:BOOLSetReadOnly(BOOLbReadOnly=TRUE);。参数:bReadOnly为TRUE,就将编辑框设置为只读;否则该编辑框可读可写。上一页下一页返回3.5常用控件[例3.12]绘制一个矩形,该矩形的颜色是由用户的选择来确定的。(1)创建一个基于对话框的应用程序,名为:颜色矩形。(2)删除对话框上的“确定”和“删除”按钮,参照图3.45向对话框添加控件,按表3.11设置控件属性和设置关联变量。(3)在“颜色矩形Dlg.h”文件的public下,添加公有成员变量:

intm_change;//修改标志在“颜色矩形Dlg.cpp”文件的构造函数中设置初值:

m_change=1;//表示根据选择的颜色画矩形上一页下一页返回3.5常用控件(4)添加消息映射函数及其代码:右击对话框的“应用”按钮,在弹出的快捷菜单中选择ClaasWizard命令,弹出如图3.46所示的对话框。将IDC_APPLY消息映射到CMyDlg类的“应用”控件。并添加如下代码:voidCMyDlg::OnApply(){ m_change=1;//使用户视图区无效,以清除上//一次画的图Invalidate();}上一页下一页返回3.5常用控件

说明:m_change=1说明用户单击了“应用”按钮,函数Invalidate发出WM_PAINT消息,从而触发视图类的OnPaint函数,进而重绘要更新的区域。用同样方法,为IDC_EXITBUTTON添加BN_CLICKED消息映射函数OnExitbutton,并添加如下代码:voidCMyDlg::OnExitbutton(){ OnOK();//退出}上一页下一页返回3.5常用控件(5)在颜色矩形Dlg.cpp文件的OnPaint函数中添加画矩形的代码:voidCMyDlg::OnPaint(){……else{if(m_change==1){//用屏幕上的当前值更新控制变量

UpdateData();CPaintDCdc(this);//定义一个画刷类对象

CBrushmybrush;上一页下一页返回3.5常用控件mybrush.CreateSolidBrush(RGB(m_red,m_green,m_blue));//创建画刷

CBrush*pOldbrush=(CBrush*)dc.SelectObject(&mybrush);dc.Rectangle(180,20,280,120);//画一个矩形,这里如果矩形重叠在控件上,

//可将x的两个坐标数写大些,如(220,20,320,20)等

dc.SelectObject(pOldbrush);//恢复原来的画笔

}CDialog::OnPaint();}}上一页下一页返回3.5常用控件

(6)编译运行,在红色编辑框里写“255”,再单击“应用”按钮,则旁边的矩形就呈现红色,若再在绿色编辑框里写“255”,再单击“应用”按钮,则旁边的矩形就呈现黄色。还可进行多个混合选择等,读者可自己尝试看看。结果见图3.45所示。关于绘图的知识,在后边的章节中介绍。(7)设置静态文本和编辑框的风格:上一页下一页返回3.5常用控件

将“红色”静态文本属性对话框的Styles选项卡页面设置CenterVerticall属性,并在Aligntext下拉列表框(Left、Center、Right)中选择Center属性,在ExtendedStyles选项卡中设置Clientedge(深凹下框)。同样也为“绿色”设置CenterVerticall,Center,而在ExtendedStyles选项卡中设置Staticedge(浅凹下框)。为蓝色设置CenterVerticall,Center,而在ExtendedStyles选项卡中设置ModalFrame(凸起框)属性。而三个编辑框的ExpandStyles页面风格都设置Clientedge、Staticedge和ModalFrame属性,如图3.47所示。注意:控件的风格要根据外观的需要来选择,而有些则要实现一定的功能,如“设置密码”程序中,在Styles选项卡页面设置PassWord属性。上一页下一页返回3.5常用控件[例3.13]创建“计算平均成绩”的应用程序如图3.48所示,在数学、英语、计算机编辑框中输入学生成绩后,单击“计算平均分”按钮,将在静态文本控件上显示出这3个成绩的平均分。(1)创建一个基于对话框的应用程序,名为:计算平均成绩。(2)删除对话框上的Cancel按钮,参看图3.48的控件布局,用编辑器为对话框添加如表3.12所示的控件。上一页下一页返回3.5常用控件

(3)打开ClassWizard的MemberVariables标签,在Classname中选择CMyDlog,选中所需的控件ID号,双击或单击AddVariables按钮。依次为表3.13所列控件增加成员变量。(4)在CMyDlog.cpp的OnInitDialog()函数中添加下列代码:上一页下一页返回3.5常用控件BOOLCMyDlg::OnInitDialog(){CDialog::OnInitDialog();…………m_strAve="0.00";//将成员变量数据传给控件,并在控件中显示UpdateData(FALSE);returnTRUE;}

说明:WM_INITDIALOG消息是当对话框显示前发送的,用户在此消息的映射函数中添加一些设置控件或其他的初始化代码,以便对话框创建时自动调用。上一页下一页返回3.5常用控件

(5)用ClassWziard为按钮IDC_BUTTON1在CMyDlg类中添加BN_CLICKED的消息映射,并添加代码:voidCMyDlg::OnButton1(){UpdateData();//将控件显示的数据传给成员变量

doubleave=(double)(m_nScore1+m_nScore2+m_nScore3)/3.0;m_strAve.Format("%6.2f",ave);UpdateData(FALSE);//将成员变量数据传给控件,并在控件中显示}上一页下一页返回3.5常用控件

(6)编译运行,结果如图3.48所示。说明:代码中,Format是CString类的一个经常使用的成员函数,它通过格式操作使任意类型的数据转换成一个字符串,其输出形式相当于C语言的printf()函数。上一页下一页返回3.5常用控件3.5.4列表框列表框(ListBox)是一个允许用户从已有的项目中进行选择的控件。列表框中的项目数是灵活变化的,除了可以在资源编辑器中通过设置列表框的属性来增减列表框外,还可以在程序运行时向列表框中添加或删除某些项,MFC的CListBox类封装了列表框控件的各种操作。下面先举例看一看列表框的应用情况。上一页下一页返回3.5常用控件[例3.14]创建“列表框”应用程序如图3.49所示,在编辑框中输入一个学生的名字,单击“增加”按钮,可将这个学生的名字加入到左边的列表框中;左边的列表框中选择某一个人的名字,单击“删除”按钮,可将这个选定的名字删除。(1)利用MFCAppWizard[exe]向导,创建一个基于对话框的应用程序,名为:列表框。(2)添加控件和关联的成员变量如表3.14所示,控件的布局如图3.49所示。上一页下一页返回3.5常用控件(3)添加映射消息函数1)在CMyDlg类为按钮IDC_ADD添加BN_CLICKED映射消息,并添加下列代码:

voidCMyDlg::OnAdd(){ UpdateData();//将控件显示的数据传给成员变量

if(m_strName.IsEmpty())//判断字符串是否为空

{ AfxMessageBox("请输入姓名!"); return; }上一页下一页返回3.5常用控件m_strName.TrimLeft();//去掉字符串左边的换行符号、空格和控制字符

m_strName.TrimRight(); //去掉字符串右边的换行符号、空格和控制字符

//下面语句是判断输入的字符串是否已在列表框中,即是否重复

if(m_NameList.FindString(-1,m_strName)!=LB_ERR) { AfxMessageBox("该姓名已存在,请重新输入!"); return; }上一页下一页返回3.5常用控件intindex; //将输入的字符串加到列表框中,并将索引号保存在index中

index=m_NameList.AddString(m_strName); //下面语句是将字符串与新增的列表项关联起来

m_NameList.SetItemDataPtr(index,newCString(m_strName));}上一页下一页返回3.5常用控件2)在CMyDlg类,为按钮IDC_DELETE添加BN_CLICKED消息,并添加代码:voidCMyDlg::OnDelete(){ intindex; index=m_NameList.GetCurSel();//获得当前列表项的索引

if(index!=LB_ERR) { //释放关联数据所占的内存空间

delete(CString*)m_NameList.GetItemDataPtr(index); m_NameList.DeleteString(index);//删除列表框当前选项

UpdateData(false);//在列表框中显示数据

}上一页下一页返回3.5常用控件else AfxMessageBox("没有选择列表项或选择失败!");}3)在CMyDlg类,为按钮IDC_EXITBUTTON添加BN_CLICKED映射消息,并添加代码:voidCMyDlg::OnExitbutton(){ OnOK();// 退出}(4)编译运行,结果如图3.49所示。上一页下一页返回3.5常用控件1.列表框的基本操作列表框中的列表项可以用每一项各自的文本字符串来标识,还可以通过每一列表项的索引来确定。索引表明项目在列表中的排列位置,它从0开始计算,即列表中第一项的索引是0,第二项的索引是1,以此类推。(1)添加列表项列表框创建时是一个空的列表,需要用户添加或插入一些列表项。CListBox类的成员函数AddString和InsertString分别用于添加列表项,其函数原型为:

intAddString(LPCTSTRlpszItem);intInsertString(intnIndex,LPCTSTRlpszItem);上一页下一页返回3.5常用控件

其中:列表项的字符串文本由参数lpszItem来指定,成功返回列表在列表框的索引,错误返回LB_ERR,空间不够返回LB_ERRSPACE;但InsertString函数不会将列表项进行排序,不管列表框控件是否具有sort(按字母顺序排列)属性,只是将列表项插在指定索引的列表项之前,若nIndex等于-1,则列表项添加在列表框末尾;而AddString函数在当列表框控件具有sort属性时会自动将添加的列表项进行排序;函数原型中,LPCTSTR类型用于表示一个常值字符指针,这里可以将其理解成是一个常值字符串类型。以上两个函数只能将字符串增加到列表框中,但有时用户还会需要根据列表项,使用其他数据。这时,ListBox的SetItemData和SetItemDataPtr能有效解决这个问题,它们能使用户数据和某个列表项关联起来:上一页下一页返回3.5常用控件intSetItemData(intnIndex,DWORDdwItemData);intSetItemDataPtr(intnIndex,void*pData);

其中,函数SetItemData是将一个32位数与某列表项(由nIndex指定)关联起来,而SetItemDataPtr函数可以将用户的数组、结构体等大量的数据与列表项相关联。若产生错误,它们都返回LB_ERR。上一页下一页返回3.5常用控件

与上述两个函数相对应的两个函数是GetItemData和GetItemDataPar,它们分别用来获取相关联的用户数据。原型如下:DWORDGetItemData(intnIndex)const;void*GetItemDataPtr(intnIndex)const;(2)列表框的单项选择当选中列表框中某个列表项时,用户可以使用CListBox::GetCurSel函数来获取当前选项中的列表项的索引值。与该函数相对应的CListBox::SetCurSel函数用来设定某个列表项呈选中状态(高亮显示)。上一页下一页返回3.5常用控件intGetCurSel()const;//返回当前选择项的索引intSetCurSel(intnSelect);

参数:nSelect用来指定要设置的列表项的索引,错误时这两个函数都将返回LB_ERR。若要获取某个列表项的字符串,可以用下列函数:intGetText(intnIndex,LPTSTRlpszBuffer)const;voidGetText(intnIndex,CString&rString)const;

参数:nIndex用来指定列表项的索引,lpszBuffer和rString用来存放列表项的文本。上一页下一页返回3.5常用控件(3)查找列表框为了保证列表项不会重复地添加到列表框中,需要对列表框进行查找,可用CListBox类的成员函数FindString和FindStringExact在列表框中查找与其所匹配的列表项,其中,FindStringExact函数的查找精度高。这两个函数的原型如下:intFindString(intnStartAfter,LPCTSTRlpszItem)const;intFindStringExact(intnIndexStart,LPCTSTRlpszFind)const;

参数:lpszItem和lpszFind指定要查找的列表项的文本值,nStartAfter和nIndexStart指定查找的开始位置,若为-1,则从头至尾查找。找到后,这两个函数都返回所匹配的列表项的索引,否则返回LB_ERR。上一页下一页返回3.5常用控件(4)删除列表项利用CListBox类的成员函数DeleteString和ResetContent可以删除指定的列表项或列表框的所有表目,其函数原型如下:intDeleteString(UINTnIndex);voidResetContent();

参数:nIndex指定要删除的列表项的索引。注意:若在添加列表项时使用SetItemDataPtr函数,必须在进行删除操作时及时将关联数据所占的内存空间释放出来。上一页下一页返回3.5常用控件2.列表框的风格按性质来分,列表框有单选、多选、扩展多选以及非选四种类型,默认风格下的单选列表框让用户一次只能选择一个项,多选列表框可让用户一次选择几个项,而扩展多选列表框允许用户用鼠标拖动或其他特殊组合键进行选择,非选择列表框不提供选择功能。列表框还有一系列其他风格,用于定义列表框的外观及操作方式,这些风格可在如图3.50所示的列表框的Styles选项卡中设置。表3.15列出了Styles各项的含义。上一页下一页返回3.5常用控件3.列表框的通知消息当列表框中发生了某个动作,如用户双击选择了列表框中某一项时,列表框就会向其父窗口发送一条通知消息。常用的通知消息如表3.16所示。[例3.15]编一个学生成绩登记程序如图3.51所示,在编辑框中输入学生姓名和3门课程的成绩;姓名被添加在列表框中,成绩与该列表项关联。任何时候选中列表中某个学生,相应的记录数据都被显示出来。上一页下一页返回3.5常用控件(1)创建一个基于对话框的应用程序,名为:成绩登记。(2)删除原来的Cancel按钮,参看图3.51的控件布局,用编辑器为对话框添加如表3.17所示的控件。(3)打开成绩登记Dlg.h头文件,在public:下添加数组,代码如下:structSCORE{intscoreE;//英语成绩

intscoreM;//数学成绩

intscoreC;//计算机成绩};(4)打开ClassWizard的MemberVariables选项卡,在Classname中选择CMyDlg,选中所需的控件ID号,双击或单击AddVariables按钮,依次为表3.18所示控件增加成员变量。上一页下一页返回3.5常用控件(5)切换到ClassWizard的MessageMaps选项卡,在CMyDlg类为按钮IDC_ADD(添加记录)添加BN_CLICKED的消息映射,并添加下列代码:voidCMyDlg::OnAdd(){UpdateData(TRUE);//将控件值赋值给成员变量,UpdateData(FALSE)将成员变量值赋值给控件

//判断m_strName是否为空

if(m_strName.IsEmpty()){MessageBox("姓名不能为空!"); return; }上一页下一页返回3.5常用控件m_strName.TrimLeft();//删除字符串m_strName左边的空格及控制字符

m_strName.TrimRight();//删除字符串m_strName右边的空格及控制字符

if((m_List.FindString(-1,m_strName))!=LB_ERR)//FindString()在ListBox的项中搜索所有搜索文本的实例,即查找有无重复项

{MessageBox("列表框中已有相同姓名,不能添加!");return; }//向列表框添加学生姓名,并将该学生姓名在列表框中的位置即索引号赋给nIndex,nIndex是索引//号。上一页下一页返回3.5常用控件intnIndex=m_List.AddString(m_strName);SCOREdata;//定义3门成绩的结构体变量

data.scoreE=m_nEng;//英语成绩赋予结构体中的变量scoreYdata.scoreM=m_nMat;//数学成绩赋予结构体中的变量scoreMdata.scoreC=m_nCom;//计算机成绩赋予结构体中的变量scoreJm_List.SetItemDataPtr(nIndex,newSCORE(data));}上一页下一页返回3.5常用控件说明:①SetItemDataPtr()或SetItemData()是将一个32位的指针(或一个DWORD的值)同列表框中的一个条目联系起来,并且在设置后可以通过调用GetItemDataPtr()或GetItemData()而获取,这样做的目的是可以将列表框中的条目同外部数据建立联系,这里是姓名和他的成绩联系起来。②DWORD表示32位无符号整数,段地址和相关的偏移地址。(6)用ClassWizard在CMyDlg类为按钮IDC_DEL(删除记录)添加BN_CLICKED的消息映射,并添加下列代码:上一页下一页返回3.5常用控件voidCMyDlg::OnDel(){intnIndex=m_List.GetCurSel();//获得当前选项的索引

if(nIndex!=LB_ERR){m_List.DeleteString(nIndex);//删除当前选择项

m_strName.Empty(); m_nEng=m_nMat=m_nCom=0; UpdateData(FALSE);//将成员变量值赋值给控件,将编辑框的成绩充0 } elseMessageBox("当前没有选择项或列表框操作失败!");}上一页下一页返回3.5常用控件说明:①m_List.GetCurSel();获取当前选择项基于零的索引,若有,则在单选列表框中,如果nIndex不是指定的有效索引,则返回LB_ERR,参数nIndex指定获取的字符串的基于零的索引;②if(nIndex!=LB_ERR)表示如果当前无选择项或列表框是多选框时,为LB_ERR。(7)用ClassWizard在CMyDlg类为按钮IDC_LIST添加LBN_SELCHANGE(当前选择项发生改变)的映射消息,并添加下列代码:上一页下一页返回3.5常用控件voidCMyDlg::OnSelchangeList1(){intnIndex=m_List.GetCurSel();//获得当前项索引

if(nIndex!=LB_ERR)//有效索引,则

{m_List.GetText(nIndex,m_strName);//获得索引号对应的姓名

SCORE*data=(SCORE*)m_List.GetItemDataPtr(nIndex);//获得索引号对应的数据

m_nEng=data→scoreE;//将输入到编辑框的英语成绩赋给对应的成员变量

m_nMat=data→scoreM;//将输入到编辑框的数学成绩赋给对应的成员变量

m_nCom=data→scoreC;//将输入到编辑框的计算机成绩赋给对应的成员变量

UpdateData(FALSE);//再将成员变量值赋给编辑框,用作显示

}}上一页下一页返回3.5常用控件(8)用ClassWizard在CMyDlg类为对话框添加WM_DESTROY消息映射,并添加代码:voidCMyDlg::OnDestroy(){for(intnIndex=m_List.GetCount()-1;nIndex>=0;nIndex--) {//删除所有与列表相关联的SCORE结构数据,并释放内存

delete(SCORE*)m_List.GetItemDataPtr(nIndex); } CDialog::OnDestroy();//关闭对话框}(9)编译运行,结果如图3.51所示。上一页下一页返回3.5常用控件说明:①getCount():返回编辑器内容的字数统计。nIndex=m_List.GgetCount(intnType);如果有参数,这是唯一的参数,是一个表示获取字数统计的类型,数字型。其值必须是下面三种之一:0:表示统计英文字数;1:表示统计中文字数;2:表示统计中文和英文的字数。②对话框被清除时发送WM_DESTROY消息。用户在此消息的映射函数中添加一些对象删除代码,以便在对话框清除前有效地释放内存空间。上一页下一页返回3.5常用控件3.5.5组合框组合框(ComboBox)控件是一个列表框和一个编辑框(或静态控件)结合而成的特殊控件,因此,组合框控件可分为编辑区和列表区两个部分。用户当前在列表区里选中的选项将被显示在控件的编辑区中。其中,组合框控件的列表区可以始终处于打开显示状态,也可以仅当用户单击组合框控件旁边的下拉箭头按钮时才被打开。下面先举一简单实例,看一看组合框的应用。上一页下一页返回3.5常用控件[例3.16]创建一个“组合框”应用程序这个程序的功能是:如果在组合框中选择“可视化教室”所在的房间,则在组合框下方显示用户的选择。例如,在组合框中选择了“20号楼202房间”,则在组合框下方显示“可视化教室位于20号楼202房间”,如图3.52所示。(1)利用MFCAppWizard[exe]向导创建一个基于对话框的应用程序,名为:组合框。(2)参照图3.52的控件布局,向对话框添加表3.19所示的控件和关联的成员变量。上一页下一页返回3.5常用控件(3)在“组合框Dlg.h”头文件public下添加如下成员变量:CStringmsg;intm_change;在“组合框Dlg.cpp”实现文件的构造函数中为如上成员变量赋初值:CMyDlg::CMyDlg(CWnd*pParent/*=NULL*/):CDialog(CMyDlg::IDD,pParent){……………… msg=""; m_change=0;}上一页下一页返回3.5常用控件(4)右击组合框控件(IDC_ROOM),在Data属性中输入:20号楼201房间、20号楼202房间、20号楼203房间、20号楼204房间、20号楼205房间、20号楼206房间注意:输入时,一定要每个房间号占一行,如“20号楼201房间”要占一行,按Ctrl+Enter组合键换行后再写20号楼202房间……(5)添加消息映射函数1)在CMyDlg类为退出按钮控件(IDC_EXITBUTTON),添加BN_CLICKED消息映射,并添加代码:上一页下一页返回3.5常用控件voidCMyDlg::OnExitbutton(){ OnOK();//退出}2)在CMyDlg类为组合框控件(IDC_ROOM),添加CBN_SELCHANGE消息映射,并添加代码:voidCMyDlg::OnSelchangeRoom(){ CStringroomname; intindex=m_Room.GetCurSel();//获得当前选项的索引

if(index==CB_ERR) {AfxMessageBox("出现错误"); return; }上一页下一页返回3.5常用控件m_Room.GetLBText(index,roomname);//获得当前选项的文本→roomname(教室编号) msg="可视化教室位于"; msg+=roomname; m_change=1; Invalidate();//使用户视图区无效,以清除上一次画的图}(6)在实现文件CMyDlg.cpp的OnPaint函数中添加显示文本的代码:voidCMyDlg::OnPaint()上一页下一页返回3.5常用控件{if(IsIconic()){ ……… } else {if(m_change==1) { CPaintDCdc(this); //设置透明模式

dc.SetBkMode(TRANSPARENT);dc.TextOut(50,100,msg);//输出文本

} CDialog::OnPaint();}}(7)编译运行,结果如图3.53所示。上一页下一页返回3.5常用控件说明:①当视图变得无效时(包括大小的改变,移动,被遮盖等),Windows将WM_PAINT消息发送给它。该视图的OnPaint处理函数通过创建CPaintDC类的dc对象来响应该消息并调用视图的OnDraw成员函数。通常不必编写重写的OnPaint处理成员函数;②CPaintDC类是一个来自CDC的设备环境类。它在构造期间执行CWnd::BeginPaint,在析构期间执行CWnd::EndPaint,一个CPaintDC对象只在响应一个WM_PAINT消息的时候被使用,通常是在OnPaint消息处理成员函数中;③SetBkMode(OPAQUE)用当前的背景颜色填充背景同,或者SetBkMode(TRANSPAARENT)使背景保持不变,

温馨提示

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

评论

0/150

提交评论