02界面编程4控件.docx
- 文档编号:18002736
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:27
- 大小:151.82KB
02界面编程4控件.docx
《02界面编程4控件.docx》由会员分享,可在线阅读,更多相关《02界面编程4控件.docx(27页珍藏版)》请在冰点文库上搜索。
02界面编程4控件
2.控件
控件(control)是一类用于显示数据、接受输入和完成操作的图形对象,一般放置在对话框或窗口中。
1)控件类
MFC9.0中有35个控件类,它们都是从CWnd类直接或间接派生的。
常用的控件类有:
●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(树形控件类)等,由于时间关系,本课程不讲。
但是其中翻滚按钮控件类,在下面的例子中会讲到其使用方法。
2)控件工具箱
控件工具箱
控件一般被放置在对话框中,在VS的对话框编辑器中有一个控件工具箱,用于向对话框中添加各种控件(29种)。
3)使用控件
为了演示几种主要控件的功能和使用方法,我们举一个收集个人信息的操作型对话框例子。
为此另创建一个“基于对话框的”(不是“单文档”或“多个文档”)类型的应用程序PersonInfo,其对话框资源的设计如右图。
对输入型对话框,只要为控件设置了成员变量,在对话框进行初始化时,以及当对话框被桉“确定”钮关闭后,都会自动进行数据交换,所以只需直接设置或使用成员变量的值即可。
但本例是基于对话框的应用程序,属于操作型对话框,需要自己在对话框的初始化函数中对各个控件的取值进行初始化;还要(在对话框关闭前)获得用户当前的输入和选择。
这些操作,都必须自己调用CWnd的有关成员函数,或另外创建控件类后再调用其成员函数来完成。
下面是PersonInfo项目对话框中控件的ID设置表:
控件
类型
ID
姓名
编辑控件
IDC_NAME
男
单选钮
IDC_MALE
女
单选钮
IDC_FEMALE
年龄
编辑控件
IDC_AGE
翻滚控件
IDC_SPIN_AGE
学历
列表框
IDC_EDU
专业
组合框
IDC_SPEC
文学
复选框
IDC_LETTER
艺术
复选框
IDC_ART
运动
复选框
IDC_SPORT
结果
按钮
IDC_RESULT
关闭
按钮
IDOK
下面是对话框初始化函数的部分代码(红色部分为新加的):
BOOLCPersonInfoDlg:
:
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_SPEC);
pCB->AddString(L"国际经济与贸易");
pCB->AddString(L"法学");
pCB->AddString(L"计算机科学与技术");
pCB->AddString(L"网络工程");
pCB->AddString(L"信息安全");
pCB->SetCurSel
(2);
CheckDlgButton(IDC_LETTER,1);
CheckDlgButton(IDC_SPORT,1);
returnTRUE;//除非将焦点设置到控件,否则返回TRUE
}
其中,GetDlgItem为CWnd类的成员函数,作用是返回控件(窗口)对象,其函数原型为:
(其中的输入参数nID为控件的ID)
CWnd*GetDlgItem(intnID)const;
(1)单选钮
为了使一组单选钮能够自动工作,必须将每个单选钮的“Auto”属性都设置为“True”(缺省就为“True”);还要将分组中的第1个单选钮的分组“Group”属性设为True,而其余单选钮的“Group”属性保留为缺省的“False”;并为第1个单选钮的ID设置整数成员变量(其余单选钮的ID不会出现在“添加成员变量向导”对话框中)。
在对话框桉OK关闭后,可根据该变量的值(第1个单选钮=0,第2个=1,...)来确定哪个单选钮被选中。
注意:
必须使一组单选钮的ID值连续递增(可以手工修改资源头文件resouce.h来达到此目的);还必须使一组单选钮的在资源文件中的资源描述行是连续顺序排列的(可以以源代码的方式打开资源代码文件*.rc,手工调整代码行的顺序)。
说明:
在VS05的“添加成员变量向导”对话框中,如果未安装补丁程序,则系统会自动将单选钮值变量的类型设置为BOOL(而且没有其他的变量类型选项),可以手工改为int。
如果已经安装了补丁程序,则系统会自动将单选钮值变量的类型设置为int。
在对话框初始化时,可以调用CWnd的成员函数:
voidCheckRadioButton(intnIDFirstButton,intnIDLastButton,intnIDCheckButton);
来手工设置指定单选钮组中某个单选钮的初始状态为选中(同组中其余单选钮为未选中)。
例如:
CheckRadioButton(IDC_MALE,IDC_FEMALE,IDC_MALE);
在对话框未关闭时,该整数未被赋值,则需要调用CWnd的成员函数:
UINTIsDlgButtonChecked(intnIDButton)const;
来判断单选钮nIDButton是否被选中(选中时函数的返回值非0)。
(2)复选框
复选框是各自独立的,不需要设置自动与分组属性,且必须为每个复选框设置布尔成员变量。
在对话框桉OK关闭后,可根据其值是否为真来确定其是否被选中。
与单选钮一样,在对话框初始化时,可以调用CWnd的成员函数:
voidCheckDlgButton(intnIDButton,UINTnCheck);
来手工设置按钮的初始状态:
nCheck=0或1,对应于未选中或选中。
例如:
CheckDlgButton(IDC_LETTER,1);
CheckDlgButton(IDC_SPORT,1);
在对话框未关闭时,该变量未被赋值,则可同单选钮一样,调用IsDlgButtonChecked来判断。
(3)列表框
列表框不能在创建对话框资源时输入表项,而必须在对话框的初始化函数OnInitDialog中,构造列表框对象后,调用其成员函数(表项序号从0开始)
intAddString(LPCTSTRlpszItem);//在表后添加(若无LBS_SORT属性)
//可在属性窗口中将Sort属性设置为False[缺省为True]
intInsertString(intnIndex,LPCTSTRlpszItem);//在表的nIndex处插入
//若nIndex=-1则在表后添加
向列表框中添加或插入表项。
并用其另一个成员函数:
intSetCurSel(intnSelect);
来设置初始的选中表项。
例如
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由该序号得到对应的串:
intGetCurSel()const;
intGetText(intnIndex,LPTSTRlpszBuffer)const;
voidGetText(intnIndex,CString&rString)const;
(4)组合框
对组合框,可以在属性窗口的“行为”栏最底部的“数据”项中输入表项数据,用分号分隔每一项。
可为组合框ID设置一个整数成员变量,在对话框桉OK关闭后,其值既为选中表项的序号。
似列表框,也可在OnInitDialog函数中,创建一个CComboBox对象,调用同样的成员函数SetCurSe来设置初始的选中表项(它会出现在编辑框中)。
例如
CComboBox*pCB=(CComboBox*)GetDlgItem(IDC_SPEC);
pCB->AddString(L"国际经济与贸易");
pCB->AddString(L"法学");
pCB->AddString(L"计算机科学与技术");
pCB->AddString(L"网络工程");
pCB->AddString(L"信息安全");
pCB->SetCurSel
(2);
类似地,也可在对话框未关闭时,用GetCurSel函数获得选中表项的序号,再用函数
intGetLBText(intnIndex,LPTSTRlpszText)const;
voidGetLBText(intnIndex,CString&rString)const;
由该序号得到对应的串。
(5)静态文本与编辑控件
静态文本与编辑控件的操作相对简单,只要设置了成员变量,当对话框桉OK关闭后,会自动进行数据交换,直接使用成员变量即可。
在对话框初始化时,可以调用CWnd的成员函数:
voidSetDlgItemText(intnID,LPCTSTRlpszString);
voidSetDlgItemInt(intnID,UINTnValue,BOOLbSigned=TRUE);
来手工设置控件的初值。
在对话框未关闭时,则必须自己调用CWnd的成员函数:
intGetDlgItemText(intnID,LPTSTRlpStr,intnMaxCount)const;
intGetDlgItemText(intnID,CString&rString)const;
UINTGetDlgItemInt(intnID,BOOL*lpTrans=NULL,BOOLbSigned=TRUE)const;
来获得用户的输入。
(6)翻滚控件
翻滚控件(spincontrol)又叫上下[滚动]控件(up-downcontrol),一般它与一个伙伴(buddy)控件(通常是编辑控件)结合在一起,用于修改(加减)伙伴控件中的数值(通常为整数)。
说明:
翻滚控件的伙伴控件是逻辑上位于其前面的控件,即在创建对话框资源的过程中先于翻滚控件而创建的前一个控件。
如果顺序不对,可以以文本方式打开“*.rc”文件,在对应的对话框代码段中,手工调整对应控件行的顺序。
如果伙伴控件中的数值为整数,可将翻滚控件的“AutoBuddy”和“SetBuddyInteger”属性都设置为“True”(它们缺省都为“False”),则几乎不用编程它就能正常工作,只需在对话框的初始化函数OnInitDialog中,设置翻滚控件的变化范围即可。
翻滚控件的缺省变化范围为100~0。
因为这时的最小值>最大值,所以按翻滚控件的上/下箭头按钮时,其位置值的加减是反过来的,即:
按上箭头按钮=减1/按下箭头按钮=加1。
可以用CSpinButtonCtrl类的成员函数SetRange来重新设置其变化范围:
voidSetRange(shortnLower,shortnUpper);
例如:
m_ctSpinAge.SetRange(0,150);
以下部分适用于非整数伙伴控件的翻滚(在本例中用不上,不是基本内容,可以不看):
____________________________________________________________________________________________
如果翻滚控件的伙伴控件中的值不是整数(例如是浮点数),则还需要用CSpinButtonCtrl类的成员函数:
intSetPos(intnPos);
来设置当前位置。
用另一个成员函数:
intGetPos()const;
来获取当前位置(低16位)(如果所得值的高16位非0,则表示出现了错误)。
可为对话框添加WM_VSCROLL信息的响应函数,且在该函数中手工设置翻滚控件的伙伴控件的数值。
例如:
(假设编辑控件的值为0.0~150.0,翻滚控件的范围为0~1500)
voidCPersonInfoDlg:
:
OnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)
{
//TODO:
在此添加消息处理程序代码和/或调用默认值
if(pScrollBar->GetDlgCtrlID()==IDC_SPIN_AGE){
CStringstr;
str.Format(L"%3.1f",(double)nPos/10.0);
((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowText(str);
//m_ctSpinAge.GetBuddy()->SetWindowText(str);
//SetDlgItemText(IDC_AGE,str);
}
CDialog:
:
OnVScroll(nSBCode,nPos,pScrollBar);
}
这需要在对话框初始化函数中,设置翻滚控件的变化范围和当前位置:
(假设m_fAge为浮点数,当前值为22.0)
m_ctSpinAge.SetRange(0,1500);
m_ctSpinAge.SetPos((int)(m_fAge*10.0));
____________________________________________________________________________________________
(7)按钮
一般按钮为命令接口,当用户按下命令按钮时,在其单击通知消息BN_CLICKED的响应函数OnBnClicked*中进行若干处理。
例如,在个人信息对话框例子中,在CPersonInfoDlg类中,为“结果”按钮(IDC_RESULT)添加单击通知消息的响应函数OnBnClickedResult。
在该函数中,获取用户的各种输入和选择,然后调用信息框函数MessageBox将结果显示出来。
代码如下:
voidCPersonInfoDlg:
:
OnBnClickedResult()
{
//TODO:
在此添加控件通知处理程序代码
CStringsName,sAge,sEdu;
wchar_tbuf[20];
GetDlgItemText(IDC_NAME,sName);
GetDlgItemText(IDC_AGE,sAge);//可以用下面的两个语句代替
/*intiAge=GetDlgItemInt(IDC_AGE);
_itow_s(iAge,sAge.GetBuffer(),sAge.GetLength(),10);*/
CListBox*pLB=(CListBox*)GetDlgItem(IDC_EDU);
pLB->GetText(pLB->GetCurSel(),sEdu);
CComboBox*pCB=(CComboBox*)GetDlgItem(IDC_SPEC);
pCB->GetLBText(pCB->GetCurSel(),buf);
CStringstr=sName+(IsDlgButtonChecked(IDC_MALE)?
L"男":
L"女")
+sAge+L"岁\n"+buf+L"专业"+sEdu+L"毕业"
+L"\n爱好:
"+(IsDlgButtonChecked(IDC_LETTER)?
L"文学":
L"")
+(IsDlgButtonChecked(IDC_ART)?
L"艺术":
L"")
+(IsDlgButtonChecked(IDC_SPORT)?
L"运动":
L"");
MessageBox(str,L"结果");
}
显示结果图如下:
下面的4)~6)中的内容,在“个人信息”的例子中暂时用不着,但在一些较高级的对话框程序中还是很有用的。
例如,在以后要做的“颜色对话框”作业中就要用到。
4)动态修改数据
在程序运行时可以调用对话框类的基类CWnd的成员函数,如:
UINTGetDlgItemInt(intnID,BOOL*lpTrans=NULL,BOOLbSigned=TRUE)const;
voidSetDlgItemInt(intnID,UINTnValue,BOOLbSigned=TRUE);
intGetDlgItemText(intnID,LPTSTRlpStr,intnMaxCount)const;
intGetDlgItemText(intnID,CString&rString)const;
voidSetDlgItemText(intnID,LPCTSTRlpszString);
来动态获得和设置指定静态控件和编辑框所对应的整数或字符串数据。
如:
m_byHue=GetDlgItemInt(IDC_EDIT_HUE);
SetDlgItemInt(IDC_EDIT_RED,m_byRed,false);
也可以用3)所讲的方法,先创建控件对象,然后再调用控件类的成员函数来动态地获得和修改控件的状态或数据。
5)响应编辑消息
为了能在用户修改某一编辑框的数据时,程序能同步修改与之相应的其他控件中的数据,必须为编辑控件添加通知消息响应。
一般为“改变”通知消息EN_CHANGE,添加消息响应函数OnChange*。
如
voidCColorDlg:
:
OnChangeEditRed()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
if(fcsID!
=IDC_EDIT_RED)return;
m_byRed=(BYTE)GetDlgItemInt(IDC_EDIT_RED);
......
SetDlgItemInt(IDC_EDIT_HUE,m_byHue);
......
}
为了防止相关数据相互自动修改,进入无限死循环,必须区分是否为用户修改(控件为输入焦点)。
可以再添加对“设置输入焦点”的通知消息EN_SETFOCUS的响应函数OnSetfocus*,并在函数中记录当前输入焦点的控件ID。
如
voidCColorDlg:
:
OnSetfocusEditRed()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
fcsID=IDC_EDIT_RED;
}
然后,在编辑修改的消息响应函数中,判断是否该编辑控件为输入焦点(参见前一段代码的红色部分)。
只有是输入焦点时,才能对其他控件中的内容作修改。
6)获取控件上的鼠标位置
一般控件都位于对话框中,但是控件本身并没有完整的鼠标消息响应(只有按钮控件和设置通知消息属性为真的其他控件,才响应鼠标的单击和双击等消息,而不能响应诸如鼠标移动、左鼠标键按下和松开等消息),而只是在其所在的对话框类中,才可以添加各种鼠标响应函数。
如果需要获取鼠标在控件中的位置,有两种
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 02 界面 编程 控件