06界面编程4控件.docx

上传人:b****5 文档编号:7497239 上传时间:2023-05-11 格式:DOCX 页数:22 大小:278.47KB
下载 相关 举报
06界面编程4控件.docx_第1页
第1页 / 共22页
06界面编程4控件.docx_第2页
第2页 / 共22页
06界面编程4控件.docx_第3页
第3页 / 共22页
06界面编程4控件.docx_第4页
第4页 / 共22页
06界面编程4控件.docx_第5页
第5页 / 共22页
06界面编程4控件.docx_第6页
第6页 / 共22页
06界面编程4控件.docx_第7页
第7页 / 共22页
06界面编程4控件.docx_第8页
第8页 / 共22页
06界面编程4控件.docx_第9页
第9页 / 共22页
06界面编程4控件.docx_第10页
第10页 / 共22页
06界面编程4控件.docx_第11页
第11页 / 共22页
06界面编程4控件.docx_第12页
第12页 / 共22页
06界面编程4控件.docx_第13页
第13页 / 共22页
06界面编程4控件.docx_第14页
第14页 / 共22页
06界面编程4控件.docx_第15页
第15页 / 共22页
06界面编程4控件.docx_第16页
第16页 / 共22页
06界面编程4控件.docx_第17页
第17页 / 共22页
06界面编程4控件.docx_第18页
第18页 / 共22页
06界面编程4控件.docx_第19页
第19页 / 共22页
06界面编程4控件.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

06界面编程4控件.docx

《06界面编程4控件.docx》由会员分享,可在线阅读,更多相关《06界面编程4控件.docx(22页珍藏版)》请在冰点文库上搜索。

06界面编程4控件.docx

06界面编程4控件

第6章界面编程4-控件

控件(control)是一类用于显示信息、接受输入、获取选择和完成操作的图形对象,是一些特殊的窗口,一般放置在对话框(或主框架窗口的工具条和功能区)中。

在上一章的“输入学生信息”对话框中所用到的静态文本框和文本编辑框,就是典型的常用控件,前者用于显示提示文本信息,后者用于接收用户的文本输入。

单选钮、复选框、列表框和组合框等控件都用于获取用户的选择,而按钮则是用来完成特定操作的最常用控件。

本章只介绍若干常用的传统控件类及其使用方法,功能包新增加的控件类中,只有很少一部分会在第13章“MFC功能包编程简介”中略有涉及,其余的控件和控件类还有待于读者自己去学习和研究。

6.1控件

控件是特殊的小型窗口对象,具有特定的形状和功能。

MFC对Windows中的控件对象进行了C++类封装,VC08功能包又增加了对功能区、选项卡和Aero用户界面等的支持,新添加了100个MFC控件类。

VC10开始对这些新图形界面提供可视交互编辑功能,控件工具箱在原来29个传统控件的基础上又增加了11个名称以MFC开头的新控件。

6.1.1控件类

MFC提供了135个控件类,其中有35个是传统MFC原有的,其余100个是VC08功能包新增加的,传统的控件类都是窗口类CWnd的派生类。

1.控件类的层次结构图

MFC9.0(VC08)中有35个控件类,它们都是从CWnd类直接或间接派生的(即所有控件都是窗口)。

VC08功能包新增加了100个MFC控件类,其中43个也是从CWnd派生的,其余57个则是从CObject类派生的,里面有29个为功能区控件。

图6-1是按字母顺序分组排列的MFC控件类,其中带星号的控件类是功能包新增加的。

图6-1控件类的层次结构

2.常用的控件与控件类

虽然MFC中有135个控件类,但是最常用的只有近10个传统控件(类),如:

●CStatic(静态文本):

一种静态显示的窗口,一般用作标签(label)——显示静态文本串。

它不能接受鼠标和键盘输入,也不能向其父窗口(对话框等)发送WM_COMMAND消息。

静态控件有时也作为图片框,可在其中显示图像。

●CEdit(编辑控件):

一种可供用户输入和编辑文本的窗口,用于接受用户的文本输入。

在该类中,提供了大量的文本编辑函数及通知消息的响应接口。

如Copy、Cut、Paste、Clear、Undo、SetSel、ReplaceSel、GetSel、GetLine,ON_EN_CHANGE(文本内容被改变,OnChange*)、ON_EN_SETFOCUS(获得输入焦点,OnSetfocus*)、ON_EN_KILLFOCUS(失去输入焦点,OnKillFocus*)。

可以通过设置编辑控件的“Multiline”属性为“True”来实现多行文本的显示。

这时还可以设置“VScroll”属性为“True”,来支持多行文本的垂直滚动。

默认情况下,编辑控件的“Multiline”属性为“False”,“VScroll”属性也为“False”(而且不能修改设置)。

只有“HScroll”属性默认为“True”,可支持单行文本的水平滚动。

●CButton(按钮):

用于执行命令。

MFC在该类中为按钮(pushbutton)、复选框和单选钮三种控件提供编程接口。

按钮类控件有两个主要的通知消息:

ON_BN_CLICKED(单击OnBnClicked*)和ON_BN_DOUBLECLICKED(双击OnDoubleclicked*)。

⏹复选框(checkbox,核对盒):

可选中(TRUE,设置状态)或不选(FALSE,取消设置状态)。

在一组复选框中,可以有多个被选中,也可以一个都不选,没有排他性。

⏹单选钮(radiobutton,收音机钮):

也可选中(TRUE,设置状态)或不选(FALSE,取消设置状态),但在一组单选钮中,每次只能有一个被选中,且必须有一个被选中,具有排他性。

●CListBox(列表框):

显示一串项目列表供用户查看和选择。

常用函数有:

GetSel/SetSel、GetCurSel/SetCurSel、AddString/InsertString/DeleteString等。

●CComboBox(组合框):

是编辑框与列表框的组合。

用户可在编辑框内输入表项串,也可从列表框中选择表项,编辑框会显示选中的表项。

有如下三种风格的组合框,它们各有自己的适用情形:

⏹简单组合框(CBS_SIMPLE):

列表始终可见。

⏹下拉组合框(CBS_DROPDOWN):

列表只是在下拉时可见,编辑框可编辑。

⏹下拉表组合框(CBS_DROPDOWNLIST):

列表也只是在下拉时可见,但编辑框不可编辑。

●其他比较常用的控件类有:

CProgressCtrl(进度控件)、CSliderCtrl(滑块控件)、CSpinButtonCtrl(翻滚按钮控件)、CTabCtrl(选卡控件)和CTreeCtrl(树形控件)等。

其中的翻滚按钮控件类会在下面的“个人信息”对话框例子中用到,进度控件在本章的6.2.3中也会简单介绍,滑块控件则会在10.1.6节用到。

由于时间关系,其余的控件本书不讲,有兴趣的读者可以自己找资料(如MSDN帮助系统)查看。

6.1.2工具箱

控件一般被放置在对话框中,在VC的对话框编辑器中有一个含40种控件工具的控件工具箱(参见图6-2),用于在可视化对话框编辑的交互操作中为对话框添加各种控件。

6.2控件用法

下面我们以一个用于收集学生个人信息的操作型对话框为例,来演示几种主要控件的功能和使用方法。

6.2.1个人信息对话框例

为此,新创建一个“基于对话框的”(不是“单文档”或“多个文档”)类型的MFC应用程序PInfo(需保留“使用HTML对话框”复选框的去选状态),其对话框资源的设计如图6-3所示。

图6-3个人信息对话框

对输入型对话框,只要为控件设置了成员变量,在对话框进行初始化时,以及当对话框被桉“确定”钮关闭后,都可利用MFC提供的DDX功能进行自动数据交换,程序员只需直接设置或使用控件成员变量的值即可。

图6-2控件工具箱

但本例是基于对话框的应用程序,属于操作型对话框,在对话框显示之前程序还没有启动,而在对话框关闭时,程序也随之关闭。

因此,MFC的对话框自动数据交换功能DDX,对操作型对话框是失效的(不过,还可以使用5.2.4小节中介绍过的UpdateData函数来强制对话框交换数据。

但是,为了介绍手工读写控件信息的具体方法,本章不采用此函数)。

需要程序员自己在对话框的初始化函数中对各个控件的取值进行初始化;还需要在对话框关闭前获得用户当前的输入和选择。

这些操作,都必须自己调用CWnd和控件类的有关成员函数(或另外创建自定义控件类后再调用其成员函数)来完成。

1.控件设置

表6-1是PInfo个人信息对话框中使用的主要控件的名称、类型及ID设置,其中没有包含用于显示提示信息的静态文本框控件。

表6-1个人信息对话框中的控件设置

控件

类型

ID

控件

类型

ID

姓名

编辑控件

IDC_NAME

专业

组合框

IDC_MAJOR

单选钮

IDC_MALE

网游

复选框

IDC_GAME

单选钮

IDC_FEMALE

艺术

复选框

IDC_ART

年龄

编辑控件

IDC_AGE

运动

复选框

IDC_SPORT

年龄

翻滚控件

IDC_SPIN_AGE

结果

按钮

IDC_RESULT

学历

列表框

IDC_EDU

关闭

按钮

IDOK

2.初始化代码

下面是对话框初始化函数的部分代码(粗体部分为新加的):

BOOLCPInfoDlg:

:

OnInitDialog()

{

……

//TODO:

在此添加额外的初始化代码

SetDlgItemText(IDC_NAME,L"张三");

CheckRadioButton(IDC_MALE,IDC_FEMALE,IDC_MALE);

SetDlgItemInt(IDC_AGE,22);

CSpinButtonCtrl*pSpin=

(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_AGE);

pSpin->SetRange(0,150);

CListBox*pLB=(CListBox*)GetDlgItem(IDC_EDU);

pLB->AddString(L"大专");

pLB->AddString(L"本科");

pLB->AddString(L"硕士");

pLB->AddString(L"博士");

pLB->SetCurSel

(1);

CComboBox*pCB=(CComboBox*)GetDlgItem(IDC_MAJOR);

pCB->AddString(L"国际经济与贸易");

pCB->AddString(L"法学");

pCB->AddString(L"计算机科学与技术");

pCB->AddString(L"网络工程");

pCB->AddString(L"信息安全");

pCB->SetCurSel

(2);

CheckDlgButton(IDC_GAME,1);

CheckDlgButton(IDC_SPORT,1);

returnTRUE;//除非将焦点设置到控件,否则返回TRUE

}

其中,GetDlgItem为CWnd类的成员函数,作用是返回控件(窗口)对象的指针,其函数原型为(其中的输入参数nID为控件的ID):

CWnd*GetDlgItem(intnID)const;

注意,除了基于对话框的程序外,其他对话框类一般都需要自己添加(重写型)消息响应函数OnInitDialog,来做一些必要的初始化对话框的工作。

为对话框类添加OnInitDialog函数的方法,与在3.2.5小节第3部分“添加重写型初始化函数”中,为视图类添加OnInitialUpdate函数的类似。

6.2.2使用常用控件

下面结合个人信息对话框例,详细介绍几种常用控件的使用方法及代码编写。

1.单选钮

为了使一组单选钮能够自动工作,必须将每个单选钮的“Auto”属性都设置为“True”(默认就为“True”);还要将分组中的第1个单选钮的分组“Group”属性设为True,而其余单选钮的“Group”属性保留为默认的“False”。

如果是使用DDX的信息型用户对话框(本例不是),还需要为第1个单选钮ID添加(默认的)int类型成员变量(其余单选钮的ID不会出现在“添加成员变量向导”对话框中),注意要保持“控件变量”复选框为默认的未选中状态。

在对话框桉确定或OK钮关闭后,可根据该变量的值(=0:

选中第1个单选钮,=1:

第2个,……,以此类推)来确定哪个单选钮被选中。

注意:

必须使一组单选钮的ID值连续递增(可以手工修改资源头文件resouce.h来达到此目的);还必须使一组单选钮的在资源文件中的资源描述行是连续顺序排列的(可用源代码的方式打开资源代码文件*.rc,手工调整代码行的顺序)。

在对话框初始化时,可以调用CWnd的成员函数CheckRadioButton来手工设置指定单选钮组中某个单选钮的初始状态为选中(同组中其余单选钮为未选中),其函数原型为:

voidCheckRadioButton(intnIDFirstButton,intnIDLastButton,intnIDCheckButton);

例如:

CheckRadioButton(IDC_MALE,IDC_FEMALE,IDC_MALE);

在对话框未关闭时,单选钮的控件变量还未被赋值,可以调用CWnd的成员函数IsDlgButtonChecked来判断ID为nIDButton的单选钮是否被选中(选中时函数的返回值非0),其函数原型为:

UINTIsDlgButtonChecked(intnIDButton)const;

例如:

if(IsDlgButtonChecked(IDC_MALE)m_bMale=true;elsem_bMale=false;

2.复选框

复选框是各自独立的,不需要设置自动与分组属性,可为每个复选框设置布尔成员变量。

在对话框桉确定或OK钮关闭后,再根据其值是否为真来判断其是否被选中。

与单选钮类似,在对话框初始化时,可以调用CWnd的成员函数:

voidCheckDlgButton(intnIDButton,UINTnCheck);

来手工设置按钮的初始状态:

nCheck=0或1,对应于未选中或选中。

例如:

CheckDlgButton(IDC_GAME,1);

CheckDlgButton(IDC_SPORT,1);

在对话框未关闭时,复选框的控件变量也未被赋值,同单选钮一样,也可调用IsDlgButtonChecked函数来判断其是否被选中。

例如,可以为个人信息对话框的“网游”复选框添加一个鼠标单击响应,在用户选中该复选框时弹出信息框,提示“少玩游戏!

”之类的话。

为按钮类控件添加事件处理程序(消息响应函数)的具体做法有如下三种:

1)利用类的属性页:

●打开类视图,选中“CPInfoDlg”类,在属性窗口中切换到事件页。

●展开“IDC_GAME”项,选中“BN_CLICKED”项,从其右边的下拉式列表选中唯一的“OnBnClickedGame”项,参见图6-4a)。

a)类属性b)控件属性c)快捷菜单

d)向导对话框

图6-4为“网游”复选框添加鼠标单击响应

2)利用控件的属性页:

●打开资源视图,选中“Pinfo.rc\Dialog\IDD_Pinfo_DIALOG”,在对话框资源中选中“网游”复选框,在属性窗口的工具条中按钮切换到事件页。

●单击“BN_CLICKED”项的右边,在出现的下拉式列表中,选中唯一的“OnBnClickedGame”项,参见图6-4b)。

3)利用快捷菜单和事件处理程序向导:

●打开资源视图,选中“Pinfo.rc\Dialog\IDD_Pinfo_DIALOG”,在对话框资源中选中“网游”复选框。

●在该复选框中单击鼠标右键,在弹出的快捷菜单中选“添加事件处理程序”菜单项,参见图6-4c)。

在弹出的事件处理程序向导对话框中,保留默认的设置:

“BN_CLICKED”消息、“CPInfoDlg”类、“OnBnClickedGame”函数名,按“添加编辑”钮,参见图6-4d)。

然后,可以在响应代码中,添加如下语句:

if(IsDlgButtonChecked(IDC_GAME))MessageBox(L"少玩游戏!

");

3.列表框

MFC中的列表框有一个缺陷——不能在创建对话框资源时填入表项,而必须在构造列表框对象后,调用其成员函数AddString或InsertString来向列表框中添加或插入表项(表项序号从0开始),并用其另一个成员函数SetCurSel来设置初始的选中表项。

这三个函数的原型为:

intAddString(LPCTSTRlpszItem);//在表后添加(若无LBS_SORT属性时)

//可在属性窗口中将Sort属性设置为False(默认为True)

intInsertString(intnIndex,LPCTSTRlpszItem);//在表的nIndex处插入

//若nIndex=-1则在表后添加

intSetCurSel(intnSelect);//设置序号为nSelect的表项被选中

创建列表框对象和添加表项的代码,一般都放在对话框的初始化函数OnInitDialog中,例如:

CListBox*pLB=(CListBox*)GetDlgItem(IDC_EDU);

pLB->AddString(L"大专");

pLB->AddString(L"本科");

pLB->AddString(L"硕士");

pLB->AddString(L"博士");

pLB->SetCurSel

(1);

可为列表框ID设置字符串成员变量,在对话框桉确定或OK钮关闭后,其值既为选中表项中的字符串。

还可以在对话框未关闭时,用GetCurSel函数获得选中表项的序号,再用函数GetText由该序号得到对应的串,其中的GetText函数有字符数组和CString对象两个版本。

下面是这两个列表框类成员函数的原型:

intGetCurSel()const;//获得选中表项的序号

intGetText(intnIndex,LPTSTRlpszBuffer)const;//获取指定表项中的文本字符数组

voidGetText(intnIndex,CString&rString)const;//获取指定表项中的文本串

例如:

wchar_tbuf[20];pLB->GetText(pLB->GetCurSel(),buf);

4.组合框

对组合框,可以在属性窗口的“行为”栏最底部的“数据”项中输入表项数据,用分号分隔每一项。

可为组合框ID设置一个整数成员变量,在对话框桉确定或OK钮关闭后,其值既为选中表项的序号。

似列表框,也可在OnInitDialog函数中,创建一个CComboBox对象,调用同样的成员函数SetCurSe来设置初始的选中表项(它会出现在编辑框中)。

例如:

CComboBox*pCB=(CComboBox*)GetDlgItem(IDC_MAJOR);

pCB->AddString(L"国际经济与贸易");

pCB->AddString(L"法学");

pCB->AddString(L"计算机科学与技术");

pCB->AddString(L"网络工程");

pCB->AddString(L"信息安全");

pCB->SetCurSel

(2);

类似地,也可在对话框未关闭时,用组合框类的成员函数GetCurSel来获得选中表项的序号,再调用另一个成员函数GetLBText由该序号得到对应的串。

GetLBText函数也有字符数组和CString对象两个版本:

intGetLBText(intnIndex,LPTSTRlpszText)const;//获取指定表项文本字符数组

voidGetLBText(intnIndex,CString&rString)const;//获取指定表项文本串

例如:

pCB->GetLBText(pCB->GetCurSel(),buf);

5.静态文本与编辑控件

静态文本与编辑控件的操作相对简单,只要设置了成员变量,在对话框桉确定或OK钮关闭后,会自动进行数据交换,直接使用成员变量即可。

在对话框初始化时,可以调用CWnd的成员函数SetDlgItemText或SetDlgItemInt来手工设置(各种)控件的(字符串或整数)初值。

这两个函数的原型为:

voidSetDlgItemText(intnID,LPCTSTRlpszString);//设置控件的字符串整数

voidSetDlgItemInt(intnID,UINTnValue,BOOLbSigned=TRUE);//设置控件的整数

例如:

SetDlgItemText(IDC_NAME,L"张三");

SetDlgItemInt(IDC_AGE,22);

在对话框未关闭时,则可自己调用CWnd的成员函数GetDlgItemText或GetDlgItemInt来获得用户的输入。

下面是这两个函数的原型(其中的GetDlgItemText函数也有字符数组和CString对象两个版本):

intGetDlgItemText(intnID,LPTSTRlpStr,intnMaxCount)const;

intGetDlgItemText(intnID,CString&rString)const;

UINTGetDlgItemInt(intnID,BOOL*lpTrans=NULL,BOOLbSigned=TRUE)const;

例如:

CStringsName;

GetDlgItemText(IDC_NAME,sName);

intiAge=GetDlgItemInt(IDC_AGE);

6.翻滚控件

翻滚(spin,纺纱/旋转)控件又叫上下(up-down)控件,一般它与一个伙伴(buddy)控件(通常是编辑控件)结合在一起,用于修改(加减)伙伴控件中的数值(通常为整数)。

说明:

翻滚控件的伙伴控件是逻辑上位于其前面的控件,即在创建对话框资源的过程中先于翻滚控件而创建的前一个控件。

如果顺序不对,可以以文本方式打开“*.rc”文件,在对应的对话框的脚本代码段中,手工调整对应控件定义行的顺序。

如果伙伴控件中的数值为整数,可将翻滚控件的“AutoBuddy”和“SetBuddyInteger”属性都设置为“True”(它们的默认值都为“False”),则几乎不用编程它就能正常工作,只需在对话框的初始化函数OnInitDialog中,设置翻滚控件的变化范围即可。

翻滚控件的默认变化范围为100~0。

因为这时的最小值>最大值,所以按翻滚控件的上/下箭头按钮时,其位置值的加减是反过来的,即:

按上箭头按钮=减1/按下箭头按钮=加1。

可以用CSpinButtonCtrl类的成员函数SetRange来重新设置其变化范围,其原型为:

voidSetRange(shortnLower,shortnUpper);

例如:

CSpinButtonCtrl*pSpin=

(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_AGE);

pSpin->SetRange(0,150);

7.按钮

一般按钮为命令接口,当用户按下命令按钮时,可在其单击通知消息BN_CLICKED的响应函数OnBnClicked*中进行若干处理。

例如,在个人信息对话框例子中,在CPInfoDlg类中,为“结果”按钮(IDC_RESULT)添加单击通知消息的响应函数OnBnClickedResult。

具体做法是:

在对话框编辑器中选中“结果”按钮,按鼠标右键,在弹出的快捷菜单中选“添加事件处理程序”菜单项,在弹出的“事件处理向导”对话框中,保留默认设置不变,按“添加编辑”钮(可参见图6-4c)和d))。

在该响应函数中,添加下面粗体所示的代码,先获取用户的各种输入和选择,然后再调用信息框函数MessageBox将结果显示出来。

voidCPInfoDlg:

:

OnBnClickedResult()

{

//TODO:

在此添加控件通知处理程序代码

CStringsName,sAge,sEdu;

wchar_tbuf[20];

GetDlgItemText(IDC_NAME,sName);

GetDlgItemText(IDC_AGE,sAge);//可以用下面的两个语句代替

/*intiAge

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2