1、默认情况下,编辑控件的“Multiline”属性为“False”,“VScroll”属性也为“False”(而且不能修改设置)。只有“HScroll”属性默认为“True”,可支持单行文本的水平滚动。 CButton(按钮):用于执行命令。MFC在该类中为按钮(pushbutton)、复选框和单选钮三种控件提供编程接口。按钮类控件有两个主要的通知消息:ON_BN_CLICKED(单击OnBnClicked*)和ON_BN_ DOUBLECLICKED(双击OnDoubleclicked*)。 复选框(check box,核对盒):可选中(TRUE,设置状态)或不选(FALSE,取消设置状态)。
2、在一组复选框中,可以有多个被选中,也可以一个都不选,没有排他性。 单选钮(radio button,收音机钮):也可选中(TRUE,设置状态)或不选(FALSE,取消设置状态),但在一组单选钮中,每次只能有一个被选中,且必须有一个被选中,具有排他性。 CListBox(列表框):显示一串项目列表供用户查看和选择。常用函数有:GetSel / SetSel、GetCurSel / SetCurSel、AddString / InsertString / DeleteString等。 CComboBox(组合框):是编辑框与列表框的组合。用户可在编辑框内输入表项串,也可从列表框中选择表项,编辑框会
3、显示选中的表项。有如下三种风格的组合框,它们各有自己的适用情形: 简单组合框(CBS_SIMPLE):列表始终可见。 下拉组合框(CBS_DROPDOWN):列表只是在下拉时可见,编辑框可编辑。 下拉表组合框(CBS_DROPDOWNLIST):列表也只是在下拉时可见,但编辑框不可编辑。 其他比较常用的控件类有:CProgressCtrl(进度控件)、CSliderCtrl(滑块控件)、CSpinButtonCtrl(翻滚按钮控件)、CTabCtrl(选卡控件)和CTreeCtrl(树形控件)等。其中的翻滚按钮控件类会在下面的“个人信息”对话框例子中用到,进度控件在本章的6.2.3中也会简单介
4、绍,滑块控件则会在10.1.6节用到。由于时间关系,其余的控件本书不讲,有兴趣的读者可以自己找资料(如MSDN帮助系统)查看。6.1.2 工具箱控件一般被放置在对话框中,在VC的对话框编辑器中有一个含40种控件工具的控件工具箱(参见图6-2),用于在可视化对话框编辑的交互操作中为对话框添加各种控件。6.2 控件用法下面我们以一个用于收集学生个人信息的操作型对话框为例,来演示几种主要控件的功能和使用方法。6.2.1 个人信息对话框例为此,新创建一个“基于对话框的”(不是“单文档”或“多个文档”)类型的MFC应用程序PInfo(需保留“使用 HTML 对话框”复选框的去选状态),其对话框资源的设计
5、如图6-3所示。图6-3 个人信息对话框对输入型对话框,只要为控件设置了成员变量,在对话框进行初始化时,以及当对话框被桉“确定”钮关闭后,都可利用MFC提供的DDX功能进行自动数据交换,程序员只需直接设置或使用控件成员变量的值即可。图6-2 控件工具箱但本例是基于对话框的应用程序,属于操作型对话框,在对话框显示之前程序还没有启动,而在对话框关闭时,程序也随之关闭。因此,MFC的对话框自动数据交换功能DDX,对操作型对话框是失效的(不过,还可以使用5.2.4小节中介绍过的UpdateData函数来强制对话框交换数据。但是,为了介绍手工读写控件信息的具体方法,本章不采用此函数)。需要程序员自己在对
6、话框的初始化函数中对各个控件的取值进行初始化;还需要在对话框关闭前获得用户当前的输入和选择。这些操作,都必须自己调用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结果按
7、钮IDC_RESULT学历列表框IDC_EDU关闭IDOK2初始化代码下面是对话框初始化函数的部分代码(粗体部分为新加的):BOOL CPInfoDlg: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-Se
8、tRange(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); return TRUE; / 除非将焦点设置到控件,否则返回 TRUE其中,GetDlgI
9、tem为CWnd类的成员函数,作用是返回控件(窗口)对象的指针,其函数原型为(其中的输入参数nID为控件的ID):CWnd* GetDlgItem( int nID ) const;注意,除了基于对话框的程序外,其他对话框类一般都需要自己添加(重写型)消息响应函数OnInitDialog,来做一些必要的初始化对话框的工作。为对话框类添加OnInitDialog函数的方法,与在3.2.5小节第3部分“添加重写型初始化函数”中,为视图类添加OnInitialUpdate函数的类似。6.2.2 使用常用控件下面结合个人信息对话框例,详细介绍几种常用控件的使用方法及代码编写。1单选钮为了使一组单选钮能
10、够自动工作,必须将每个单选钮的“Auto”属性都设置为“True”(默认就为“True”);还要将分组中的第1个单选钮的分组“Group”属性设为True,而其余单选钮的“Group”属性保留为默认的“False”。如果是使用DDX的信息型用户对话框(本例不是),还需要为第1个单选钮ID添加(默认的)int类型成员变量(其余单选钮的ID不会出现在“添加成员变量向导”对话框中),注意要保持“控件变量”复选框为默认的未选中状态。在对话框桉确定或OK钮关闭后,可根据该变量的值(=0:选中第1个单选钮, =1:第2个,以此类推)来确定哪个单选钮被选中。注意:必须使一组单选钮的ID值连续递增(可以手工修
11、改资源头文件resouce.h来达到此目的);还必须使一组单选钮的在资源文件中的资源描述行是连续顺序排列的(可用源代码的方式打开资源代码文件*.rc,手工调整代码行的顺序)。在对话框初始化时,可以调用CWnd的成员函数CheckRadioButton来手工设置指定单选钮组中某个单选钮的初始状态为选中(同组中其余单选钮为未选中),其函数原型为:void CheckRadioButton( int nIDFirstButton, int nIDLastButton, int nIDCheckButton );例如:CheckRadioButton(IDC_MALE, IDC_FEMALE, IDC
12、_MALE);在对话框未关闭时,单选钮的控件变量还未被赋值,可以调用CWnd的成员函数IsDlgButtonChecked来判断ID为nIDButton的单选钮是否被选中(选中时函数的返回值非0),其函数原型为:UINT IsDlgButtonChecked( int nIDButton ) const;if(IsDlgButtonChecked(IDC_MALE) m_bMale = true; else m_bMale = false;2复选框复选框是各自独立的,不需要设置自动与分组属性,可为每个复选框设置布尔成员变量。在对话框桉确定或OK钮关闭后,再根据其值是否为真来判断其是否被选中。与
13、单选钮类似,在对话框初始化时,可以调用CWnd的成员函数:void CheckDlgButton( int nIDButton, UINT nCheck );来手工设置按钮的初始状态:nCheck = 0 或1,对应于未选中或选中。CheckDlgButton(IDC_GAME, 1);CheckDlgButton(IDC_SPORT, 1);在对话框未关闭时,复选框的控件变量也未被赋值,同单选钮一样,也可调用IsDlgButtonChecked函数来判断其是否被选中。例如,可以为个人信息对话框的“网游”复选框添加一个鼠标单击响应,在用户选中该复选框时弹出信息框,提示“少玩游戏!”之类的话。为
14、按钮类控件添加事件处理程序(消息响应函数)的具体做法有如下三种:1) 利用类的属性页: 打开类视图,选中“CPInfoDlg”类,在属性窗口中切换到事件页。 展开“IDC_GAME”项,选中“BN_CLICKED”项,从其右边的下拉式列表选中唯一的“OnBnClickedGame”项,参见图6-4 a)。 a) 类属性 b) 控件属性 c) 快捷菜单d) 向导对话框图6-4 为“网游”复选框添加鼠标单击响应2) 利用控件的属性页: 打开资源视图,选中“Pinfo.rcDialogIDD_Pinfo_DIALOG”,在对话框资源中选中“网游”复选框,在属性窗口的工具条中按钮切换到事件页。 单击“
15、BN_CLICKED”项的右边,在出现的下拉式列表中,选中唯一的“GetCurSel(), buf);4组合框对组合框,可以在属性窗口的“行为”栏最底部的“数据”项中输入表项数据,用分号分隔每一项。可为组合框ID设置一个整数成员变量,在对话框桉确定或OK钮关闭后,其值既为选中表项的序号。似列表框,也可在OnInitDialog函数中,创建一个CComboBox对象,调用同样的成员函数SetCurSe来设置初始的选中表项(它会出现在编辑框中)。类似地,也可在对话框未关闭时,用组合框类的成员函数GetCurSel来获得选中表项的序号,再调用另一个成员函数GetLBText由该序号得到对应的串。Ge
16、tLBText函数也有字符数组和CString对象两个版本:int GetLBText( int nIndex, LPTSTR lpszText ) const; / 获取指定表项文本字符数组void GetLBText( int nIndex, CString& / 获取指定表项文本串pCB-GetLBText(pCB-5静态文本与编辑控件静态文本与编辑控件的操作相对简单,只要设置了成员变量,在对话框桉确定或OK钮关闭后,会自动进行数据交换,直接使用成员变量即可。在对话框初始化时,可以调用CWnd的成员函数SetDlgItemText或SetDlgItemInt来手工设置(各种)控件的(字符
17、串或整数)初值。这两个函数的原型为:void SetDlgItemText( int nID, LPCTSTR lpszString ); / 设置控件的字符串整数void SetDlgItemInt( int nID, UINT nValue, BOOL bSigned = TRUE ); / 设置控件的整数SetDlgItemText(IDC_NAME, LSetDlgItemInt(IDC_AGE, 22);在对话框未关闭时,则可自己调用CWnd的成员函数GetDlgItemText或GetDlgItemInt来获得用户的输入。下面是这两个函数的原型(其中的GetDlgItemText函
18、数也有字符数组和CString对象两个版本):int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;int GetDlgItemText( int nID, CString&UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE ) const;CString sName;GetDlgItemText(IDC_NAME, sName);int iAge = GetDlgItemInt(IDC_AGE);6翻滚控件翻滚(spin,纺纱/
19、旋转)控件又叫上下(up-down)控件,一般它与一个伙伴(buddy)控件(通常是编辑控件)结合在一起,用于修改(加减)伙伴控件中的数值(通常为整数)。说明:翻滚控件的伙伴控件是逻辑上位于其前面的控件,即在创建对话框资源的过程中先于翻滚控件而创建的前一个控件。如果顺序不对,可以以文本方式打开“*.rc”文件,在对应的对话框的脚本代码段中,手工调整对应控件定义行的顺序。如果伙伴控件中的数值为整数,可将翻滚控件的“Auto Buddy”和“Set Buddy Integer”属性都设置为“True”(它们的默认值都为“False”),则几乎不用编程它就能正常工作,只需在对话框的初始化函数OnIn
20、itDialog中,设置翻滚控件的变化范围即可。翻滚控件的默认变化范围为1000。因为这时的最小值最大值,所以按翻滚控件的上/下箭头按钮时,其位置值的加减是反过来的,即:按上箭头按钮 = 减1 / 按下箭头按钮 = 加1。可以用CSpinButtonCtrl类的成员函数SetRange来重新设置其变化范围,其原型为:void SetRange( short nLower, short nUpper ); CSpinButtonCtrl *pSpin = (CSpinButtonCtrl*) GetDlgItem(IDC_SPIN_AGE);7按钮一般按钮为命令接口,当用户按下命令按钮时,可在其
21、单击通知消息BN_CLICKED的响应函数OnBnClicked*中进行若干处理。例如,在个人信息对话框例子中,在CPInfoDlg类中,为“结果”按钮(IDC_RESULT)添加单击通知消息的响应函数OnBnClickedResult。具体做法是:在对话框编辑器中选中“结果”按钮,按鼠标右键,在弹出的快捷菜单中选“添加事件处理程序”菜单项,在弹出的“事件处理向导”对话框中,保留默认设置不变,按“添加编辑”钮(可参见图6-4 c)和d)。在该响应函数中,添加下面粗体所示的代码,先获取用户的各种输入和选择,然后再调用信息框函数MessageBox将结果显示出来。void CPInfoDlg:OnBnClickedResult() 在此添加控件通知处理程序代码 CString sName, sAge, sEdu; wchar_t buf20; GetDlgItemText(IDC_NAME, sName); GetDlgItemText(IDC_AGE, sAge); / 可以用下面的两个语句代替 /*int iAge
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1