06界面编程4控件Word格式.docx
- 文档编号:18337118
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:22
- 大小:278.47KB
06界面编程4控件Word格式.docx
《06界面编程4控件Word格式.docx》由会员分享,可在线阅读,更多相关《06界面编程4控件Word格式.docx(22页珍藏版)》请在冰豆网上搜索。
默认情况下,编辑控件的“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
姓名
编辑控件
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"
大专"
本科"
硕士"
博士"
SetCurSel
(1);
CComboBox*pCB=(CComboBox*)GetDlgItem(IDC_MAJOR);
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”项,从其右边的下拉式列表选中唯一的“<
Add>
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中,例如:
可为列表框ID设置字符串成员变量,在对话框桉确定或OK钮关闭后,其值既为选中表项中的字符串。
还可以在对话框未关闭时,用GetCurSel函数获得选中表项的序号,再用函数GetText由该序号得到对应的串,其中的GetText函数有字符数组和CString对象两个版本。
下面是这两个列表框类成员函数的原型:
intGetCurSel()const;
//获得选中表项的序号
intGetText(intnIndex,LPTSTRlpszBuffer)const;
//获取指定表项中的文本字符数组
voidGetText(intnIndex,CString&
rString)const;
//获取指定表项中的文本串
wchar_tbuf[20];
GetText(pLB->
GetCurSel(),buf);
4.组合框
对组合框,可以在属性窗口的“行为”栏最底部的“数据”项中输入表项数据,用分号分隔每一项。
可为组合框ID设置一个整数成员变量,在对话框桉确定或OK钮关闭后,其值既为选中表项的序号。
似列表框,也可在OnInitDialog函数中,创建一个CComboBox对象,调用同样的成员函数SetCurSe来设置初始的选中表项(它会出现在编辑框中)。
类似地,也可在对话框未关闭时,用组合框类的成员函数GetCurSel来获得选中表项的序号,再调用另一个成员函数GetLBText由该序号得到对应的串。
GetLBText函数也有字符数组和CString对象两个版本:
intGetLBText(intnIndex,LPTSTRlpszText)const;
//获取指定表项文本字符数组
voidGetLBText(intnIndex,CString&
//获取指定表项文本串
pCB->
GetLBText(pCB->
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&
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);
7.按钮
一般按钮为命令接口,当用户按下命令按钮时,可在其单击通知消息BN_CLICKED的响应函数OnBnClicked*中进行若干处理。
例如,在个人信息对话框例子中,在CPInfoDlg类中,为“结果”按钮(IDC_RESULT)添加单击通知消息的响应函数OnBnClickedResult。
具体做法是:
在对话框编辑器中选中“结果”按钮,按鼠标右键,在弹出的快捷菜单中选“添加事件处理程序”菜单项,在弹出的“事件处理向导”对话框中,保留默认设置不变,按“添加编辑”钮(可参见图6-4c)和d))。
在该响应函数中,添加下面粗体所示的代码,先获取用户的各种输入和选择,然后再调用信息框函数MessageBox将结果显示出来。
voidCPInfoDlg:
OnBnClickedResult()
在此添加控件通知处理程序代码
CStringsName,sAge,sEdu;
wchar_tbuf[20];
GetDlgItemText(IDC_NAME,sName);
GetDlgItemText(IDC_AGE,sAge);
//可以用下面的两个语句代替
/*intiAge
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 06 界面 编程 控件