4.1.1 控件基础知识
控件(Control)是一种子窗口,应用程序用它来与其他窗口一起完成简单地输入输出操作。这些控件各自有不同的用途,但总的来说分成两大类:一类只用于输出,另一类用于输入和输出,具体的功能如表4-1所示。
表4-1
控件名称 | 用途 | MFC对应的类 |
静态文本框 | 一般显示一段固定不变的文字 | CStatic |
图片控件 | 显示图形 | |
群组控件 | 将一组控件圈起来,这样看起来美观得多 | CButton |
编辑控件 | 用户可以任意输入各种文本,同时可以查看已有内容 | CEdit |
数字滚选按钮 | 提供两个方向相反的箭头按钮,用来正向或反向逐次改变选项 | CSpinButtonCtrl |
按键按钮 | 用来产生某些命令 | CButton |
复选框 | 复选框的外形是一个空心方框,当它被选中时,复选框中就加上了一个“√” | |
单选框 | 单选按钮的外形是一个图圈,当它被选中时,按钮中心会出现一个黑点。一组单选按钮最多只能有一个被选上 | |
列表框 | 显示一个列表让用户选择一项或多项 | CListBox |
组合框 | 将列表框和编辑框有机的结合起来,用户可以选择已有的项,也可以增加新项 | CComboBox |
滚动条 | 滚动条可以是一个单独的控件,也可以是窗口的一部分。当滚动条作为其他窗口的一部分时,由系统自动处理。按滚动条的走向,可分为竖直滚动条和水平滚动条两种类型,其组成部分是一样的,两端是箭头按钮,中间是一个可沿滚动条移动的滚动块 | CScrollBar |
进度条 | 显示任务完成的进度情况 | CProgressCtrl |
滑标控件 | 与滚动条类似,但滑槽两侧可标上刻度 | CSliderCtrl |
树状控件 | 显示树状分层结构 | CTreeCtrl |
多功能编辑框 | 编辑框的加强版,功能更加全面 | CRichEditCtrl |
4.1.4 控件的公共函数
所有的控件都继承于窗口类(CWnd),所以我们用CWnd类的函数来控制控件,CWnd类与控件有关的函数如下:
BOOL EnableWindow( BOOL bEnable = TRUE );
此函数用于禁用(或启用)窗口。bEnable为真表示启用窗口,为假表示禁用窗口。禁用的窗口以灰色显示,无法响应用户的输入。
BOOL UpdateData( BOOL bSaveAndValidate = TRUE );
当用户完成输入后,调用UpdateData(TRUE)来更新与控件相关联的数据;当应用程序修改完数据后,调用UpdateData(FALSE)来更新控件的显示。CDialog类的UpdateData会调用此对话框上所有的控件的UpdateData。CDialog的OK函数会自动调用UpdateData(true)。
BOOL ShowWindow( int nCmdShow );
此函数用于显示(或隐藏)窗口,nCmdShow为SW_HIDE隐藏控件,为SW_SHOW激活并显示控件。
ClientToScreen和ScreenToClient
这两个函数分别用于客户区坐标转换为屏幕坐标、屏幕坐标转换为客户区坐标。
SetWindowText 和GetWindowText
这两个函数分别用于设置取得控件标题。
CWnd::MoveWindow
void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );
void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );
此函数用于移动窗口。x、y是新窗口左上角的坐标,nWidth、nHeight是新窗口的宽和高。lpRect是含有新窗口位置和坐标信息的CRect对象或RECT结构。bRepaint表示是否重绘。如果是顶层窗口,坐标是相对屏幕左上角的坐标,如果是子窗口坐标是相对于父窗口的客户区的左上角。
GetWindowRect
此函数用于取得窗口相对于屏幕左上角的坐标。
GetClientRect
此函数用于取得窗口客户区相对于自己的客户区的坐标,左上角一定是(0,0)。
4.1.5 各控件的使用
1.图片控件
图片控件显示一幅图形,它的Type属性决定图片的类型。
¡
¡
¡
¡
2.编辑框
用户可以在编辑框中输入文字、数字,并能剪切、粘贴、拷贝、删除输入字符。编辑框获得焦点时,就会出现一个闪动的插入符,指明当前插入的位置。
¡
¡
¡
下面以一个简单的例子演示编辑框的用法。
(1)利用应用程序向导新建一个基于对话框的程序Ex040105a。
(2)将已有的静态文本框的标题改成“请输入一个0到100的整数”。
(3)增加一个编辑框。
(4)为这个编辑框关联一个整数型的成员变量。按下Ctrl+W组合键打开类向导,激活成员变量(Member Variables)属性页,“Class Name”选择CEx040105aDlg,双击IDC_EDIT1,打开“Add Member Variable”对话框,填写如图4-5所示的内容。
图4-5
(5)填完后,单击“OK”按钮返回到“MFC ClassWizard”对话框,在最小值(Minimum Value)处输入0,最大值(Maximum Value)处输入100,如图4-6所示。
图4-6
(5)双击IDD_EX040105A_DIALOG对话框中的“OK”按钮,为它添加响应函数,具体代码如下:
void CEx040105aDlg::OnOK()
{
}
(6)按下Ctrl+F5组合键创建并运行Ex040105a.exe,查看效果。
3.数字滚选按钮
在Ex040105a例子的编辑框右边加一个数字滚选按钮,选中“Auto buddy”和“Set buddy integer”复选框,如图4-7所示。
图4-7 数字滚选按钮属性对话框
按下Ctrl+F5组合键创建并运行Ex040105a.exe,单击数字滚选按钮下面的箭头,编辑框的数字会加1;单击数字滚选按钮上面的箭头,编辑框的数字会减1。
注意:编辑框的Tab Order一定比数字滚选按钮小1。
4.按键按钮
编辑对话框时,双击按钮,会弹出“增加函数”对话框(如图4-8所示),输入新函数(或直接使用默认函数名)后,单击“确定”按钮,即可为按钮增加响应函数。
图4-8 增加成员函数对话框
5.复选框单选框
下面以一个具体的例子演示复选框和单选框的用法。
(1)利用应用程序向导新建一个基于对话框的程序Ex040105b。
(2)在对话框上加一个静态文本框和两个单选框,标题分别是“性别”、“男”、“女”,第一个单选框选中群组(Group)属性,按下Ctrl+T组合键测试一下,是否只能选“男”或“女”。
(3)利用类向导,为第一个单选框增加一个整型的成员变量m_iSex。
(4)增加1个静态文本框和3个复选框,标题分别是“个人爱好”、“中国象棋”、“上网聊天”和“电脑游戏”。
(5)双击“确定”按钮增加响应函数,具体代码如下:
void CEx040105bDlg::OnOK()
{
}
(6)为了美观,可以加一个群组控件,并把对话框的标题改成“个人信息”,按Ctrl + F5组合键创建并运行Ex040105b.exe,效果如图4-9所示。
图4-9 个人信息对话框
6.列表框
下面以一个具体的例子演示如何使用列表框。
(1)利用应用程序向导新建一个基于对话框的程序Ex040105c。
(2)增加一个ListBox,利用类向导为它关联一个控制型的成员变量,关联的类是ClistBox,变量名是m_nameListBox。
(3)在CEx040105cDlg::OnInitDialog()函数中初始化ListBox。
BOOL CEx040105cDlg::OnInitDialog()
{
}
(4)按下Ctrl+F5组合键创建并运行Ex040105c.exe,可以看到列表框中已经有了3项数据。
(5)为ListBox增加LBN_SELCHANGE消息的响应函数,具体代码如下:
void CEx040105cDlg::OnSelchangeList1()
{
}
7.组合框
下面以一个具体的例子演示组合框的用法。
(1)利用应用程序向导新建一个基于对话框的程序Ex040105d。
(2)增加一个组合框,并在它的Data属性中增加数据,可以按Ctrl + Enter键使数据分行排列,如图4-10所示。
图4-10 组合框的Data属性
(3)按下Ctrl + F5组合键创建并运行Ex040105d.exe,查看效果。用户可以输入新的爱好,也可以单击组合框展开列表,从中择合适的爱好。
(4)为确定按钮增加响应函数,代码如下:
void CEx040105dDlg::OnOK()
{
}
8.进度条
下面以一个具体的例子演示进度条的用法。
(1)利用应用程序向导新建一个基于对话框的程序Ex040105e。
(2)在主对话框上增加一个进度条,并关联一个变量m_progress。
(3)在对话框初始化的函数中加上如下代码:
BOOL CEx040105eDlg::OnInitDialog()
{
}
(4)增加一个按钮,标题改为下一步,为它增加响应函数。
void CEx040105eDlg::OnButton1()
{
}
(5)按下Ctrl + F5组合键创建并运行Ex040105e.exe,根据实际效果调整进度条的宽度。启动后的效果如图4-11所示,单击10次“下一步”按钮,效果如图4-12所示,单击20次“下一步”按钮的效果如图4-13所示。
图4-11
图4-12
图4-13
9.滑标控件
下面以一个具体的例子演示如何使用滑标控件。
(1)利用应用程序向导新建一个基于对话框的程序Ex040105f。
(2)增加一个滑标控件,利用类向导为其关联一个变量CSliderCtrl
(3)在CEx040105fDlg::OnInitDialog()的最后增加如下代码:
BOOL CEx040105fDlg::OnInitDialog()
{
}
(4)增加“确定”按钮的响应函数,代码如下:
void CEx040105fDlg::OnOK()
{
}
(5)按下Ctrl + F5组合键创建并运行Ex040105f.exe,效果如图4-14所示。
图4-14
10.多功能编辑框
要使用功能编辑框,必须在应用程序类的InitInstance( )函数中调用AfxInitRichEdit( )否则对话框弹不出来。
11.处理日期时间和日历的控件
标准控件中有专门处理日期和时间的控件──日期时间控件(Data Time Picker),它对应的类是CDateTimeCtrl。此控件有两个重要属性──“格式”(Format)属性和“滑标控制”(Use Spin Control)属性,如图4-15所示。
图4-15
格式属性决定了控件的类型,它有3个值:短日期(Short Date)、长日期(Long Date)、时间(Time)。“滑标控制”属性决定了更改日期(或时间)的方式。
注意:如果格式属性为时间,则“滑标控制”属性不能更改。
图4-16展示了这两种属性取各种不同值的区别,第一行不钩选“滑标控制”属性,第二行钩选“滑标控制”属性;第一列格式属性是短日期,第二列格式属性是长日期,第三列格式属性是时间。
图4-16
用户可以直接输入,也可通过滑标控件加一减一。如果不使用“滑标控制”,单击控件最右端会弹出如图4-17所示的新窗口,有4种方法操作此窗口。
图4-17
(1)直接选择日期。
(2)单击左上角或右上角的箭头更改月份。
(3)单击年份(如2006)激活控件后修改,如图4-18所示。
图4-18
(4)单击月份在弹出的快捷菜单中选择具体的月份,如图4-19所示。
图4-19
4.2.2
本节将介绍ListCtrl的使用,ListCtrl有4种显示方式:大图标、小图标、列表和详细资料。下面通过一个实例对以上4种显示方式进行讨论,其中大图标的效果如图4-21所示。
图4-21 Ex040202大图标预览
具体步骤如下:
(1)利用应用程序向导新建一个基于对话框的程序Ex040202。
(2)增加一个列表控件,ID为IDC_STU_LIST,利用类向导为其关联一个CListCtrl变量m_stuList。
(3)增加一幅位图IDB_ICON,长96,宽32,由3幅小位图组成。再增加一幅位图IDB_SMALL_ICON。增加两个保护级成员如下:
CImageList m_imageList ;
CImageList m_smallImageList ;
(4)在主对话框的初始化函数中增加以下代码。
BOOL CEx040202Dlg::OnInitDialog()
{
}
(5)增加一个按钮,ID为ID_SELECT,标题为“选中”,并为它增加响应函数。
void CEx040202Dlg::OnSelect()
{
}
(6)按下Ctrl + F5组合键创建并运行Ex040202.exe。选中一个或多个学生后单击“选中”按钮。
(7)增加一个私有函数,具体代码如下:
void CEx040202Dlg::SetStyle(DWORD uStyle)
{
}
(8)增加4个按钮,ID分别为IDC_ICON、IDC_LIST、IDC_REPORT、IDC_SMALL_ICON,标题分别是图标、列表、详细资料和小图标。为它们增加以下响应函数:
void CEx040202Dlg::OnIcon()
{
}
void CEx040202Dlg::OnList()
{
}
void CEx040202Dlg::OnReport()
{
}
void CEx040202Dlg::OnSmallIcon()
{
}
(9)按下Ctrl + F5组合键创建并运行Ex040202.exe,单击这四个按钮查看列表框的各种形式。
(10)为了美观加一个群组控件,去掉“确定”按钮,把“取消”按钮改成“关闭”按钮。