【转】VC常用控件的使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【转】VC常⽤控件的使⽤
4.1.1控件基础知识
控件(Control)是⼀种⼦窗⼝,应⽤程序⽤它来与其他窗⼝⼀起完成简单地输⼊输出操作。
这些控件各⾃有不同的⽤途,但总的来说分成两⼤类:⼀类只⽤于输出,另⼀类⽤于输⼊和输出,具体的功能如表4-1所⽰。
表4-1 MFC常⽤控件
控件名称⽤途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属性决定图⽚的类型。
¡ Frame(框架):该类型的图⽚控件会显⽰⼀个空⼼矩形,颜⾊属性决定它的颜⾊。
¡ Rectangle(矩形):该类型的图⽚控件会显⽰⼀个实⼼矩形,颜⾊属性决定它的颜⾊。
¡ Icon(图标):该类型的图⽚控件会显⽰⼀个图标,Image属性是要显⽰的图标的ID。
¡ Bitmap(位图):该类型的图⽚控件会显⽰⼀幅位图,Image属性是位图的ID。
2.编辑框
⽤户可以在编辑框中输⼊⽂字、数字,并能剪切、粘贴、拷贝、删除输⼊字符。
编辑框获得焦点时,就会出现⼀个闪动的插⼊
编辑框后,⽆法再输⼊。
¡ Password:此属性定义此编辑是密码框,输⼊的内容⽆法查看也不能被复制。
¡ Read Only:此属性定义编辑框是只读编辑框,只能输出不能输⼊,可以从此编辑框复制东西,再粘贴到其他地⽅。
下⾯以⼀个简单的例⼦演⽰编辑框的⽤法。
(1)利⽤应⽤程序向导新建⼀个基于对话框的程序Ex040105a。
(2)将已有的静态⽂本框的标题改成“请输⼊⼀个0到100的整数”。
(3)增加⼀个编辑框。
(4)为这个编辑框关联⼀个整数型的成员变量。
按下Ctrl+W组合键打开类向导,激活成员变量(Member Variables)属性页,“Class Name”选择CEx040105aDlg,双击IDC_EDIT1,打开“Add Member Variable”对话框,填写如图4-5所⽰的内容。
图4-5 “Add Member Variable”对话框
(5)填完后,单击“OK”按钮返回到“MFC ClassWizard”对话框,在最⼩值(Minimum Value)处输⼊0,最⼤值(Maximum Value)处输⼊100,如图4-6所⽰。
图4-6 MFC类向导设置关联变量的范围
(5)双击IDD_EX040105A_DIALOG对话框中的“OK”按钮,为它添加响应函数,具体代码如下:
void CEx040105aDlg::OnOK()
{
CDialog::OnOK();
CString strMess ;
strMess.Format("你输⼊的是%d\n",m_iIntValue);
AfxMessageBox(strMess);
}
(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()
{
CDialog::OnOK();
CString strMess ;
if(0 == m_iSex)
strMess = "你是帅哥\n";
else if(1 == m_iSex)
strMess = "你是美⼥\n";
else
strMess = "性别未知\n";
//复选框也可以关联变量,如果关联的变量值为true表⽰被选中,此处⽤另外⼀种⽅法。
strMess += "---------------\n你的受好\n";
CButton * pBtn = NULL ;
pBtn = (CButton * )GetDlgItem(IDC_CHECK1);
if(NULL != pBtn && pBtn->GetCheck())
strMess += "中国象棋\n";
pBtn = (CButton * )GetDlgItem(IDC_CHECK2);
if(NULL != pBtn && pBtn->GetCheck())
strMess += "上⽹聊天\n";
pBtn = (CButton * )GetDlgItem(IDC_CHECK3);
if(NULL != pBtn && pBtn->GetCheck())
strMess += "电脑游戏\n";
(6)为了美观,可以加⼀个群组控件,并把对话框的标题改成“个⼈信息”,按Ctrl + F5组合键创建并运⾏Ex040105b.exe,效果如图4-9所⽰。
图4-9 个⼈信息对话框
6.列表框
下⾯以⼀个具体的例⼦演⽰如何使⽤列表框。
(1)利⽤应⽤程序向导新建⼀个基于对话框的程序Ex040105c。
(2)增加⼀个ListBox,利⽤类向导为它关联⼀个控制型的成员变量,关联的类是ClistBox,变量名是m_nameListBox。
(3)在CEx040105cDlg::OnInitDialog()函数中初始化ListBox。
BOOL CEx040105cDlg::OnInitDialog()
{
//…
int nItem = m_nameListBox.AddString("张三");
m_nameListBox.SetItemData(nItem,3);
nItem = m_nameListBox.AddString("李四");
m_nameListBox.SetItemData(nItem,5);
nItem = m_nameListBox.AddString("王五");
m_nameListBox.SetItemData(nItem,7);
return TRUE; // return TRUE unless you set the focus to a control
}
(4)按下Ctrl+F5组合键创建并运⾏Ex040105c.exe,可以看到列表框中已经有了3项数据。
(5)为ListBox增加LBN_SELCHANGE消息的响应函数,具体代码如下:
void CEx040105cDlg::OnSelchangeList1()
{
int nSel = m_nameListBox.GetCurSel();
if(-1 != nSel)
{
CString strName ;
m_nameListBox.GetText(nSel,strName);
UINT uID = m_nameListBox.GetItemData(nSel);
CString strMess ;
strMess.Format("你选中了%s,他是的ID是%u",strName,uID);
}
7.组合框
下⾯以⼀个具体的例⼦演⽰组合框的⽤法。
(1)利⽤应⽤程序向导新建⼀个基于对话框的程序Ex040105d。
(2)增加⼀个组合框,并在它的Data属性中增加数据,可以按Ctrl + Enter键使数据分⾏排列,如图4-10所⽰。
图4-10 组合框的Data属性
(3)按下Ctrl + F5组合键创建并运⾏Ex040105d.exe,查看效果。
⽤户可以输⼊新的爱好,也可以单击组合框展开列表,从中择合适的爱好。
(4)为确定按钮增加响应函数,代码如下:
void CEx040105dDlg::OnOK()
{
CString strMess ;
GetDlgItem(IDC_COMBO1)->GetWindowText(strMess);
strMess = "你的爱好是:" + strMess ;
AfxMessageBox(strMess);
CDialog::OnOK();
}
8.进度条
下⾯以⼀个具体的例⼦演⽰进度条的⽤法。
(1)利⽤应⽤程序向导新建⼀个基于对话框的程序Ex040105e。
(2)在主对话框上增加⼀个进度条,并关联⼀个变量m_progress。
(3)在对话框初始化的函数中加上如下代码:
BOOL CEx040105eDlg::OnInitDialog()
{
//…
m_progress.SetRange(0,100);//设置进度的下限和上限,默认值是0和100。
m_progress.SetStep(5);//设置StepIt⼀次移动多少进度,默认值是10。
m_progress.SetPos(0);//设置进度条的初始进度。
return TRUE; // return TRUE unless you set the focus to a control
(4)增加⼀个按钮,标题改为下⼀步,为它增加响应函数。
void CEx040105eDlg::OnButton1()
{
m_progress.StepIt();
}
(5)按下Ctrl + F5组合键创建并运⾏Ex040105e.exe,根据实际效果调整进度条的宽度。
启动后的效果如图4-11所⽰,单击10次“下⼀步”按钮,效果如图4-12所⽰,单击20次“下⼀步”按钮的效果如图4-13所⽰。
图4-11 Ex040105e.exe效果图⼀
图4-12 单Ex040105e.exe效果图⼆
图4-13 Ex040105e.exe效果图三
9.滑标控件
下⾯以⼀个具体的例⼦演⽰如何使⽤滑标控件。
(1)利⽤应⽤程序向导新建⼀个基于对话框的程序Ex040105f。
(2)增加⼀个滑标控件,利⽤类向导为其关联⼀个变量CSliderCtrl m_Slider。
[a1][a1]
(3)在CEx040105fDlg::OnInitDialog()的最后增加如下代码:
BOOL CEx040105fDlg::OnInitDialog()
{
//…
m_Slider.SetRange(0,20);//范围是0到20
m_Slider.SetLineSize(4);//键盘的⽅向键⼀次移动4单位
m_Slider.SetPageSize(5);//⽤户单击⼀下⿏标移动5单位
//⿏标拖动⼀次移动1单位
return TRUE; // return TRUE unless you set the focus to a control
}
(4)增加“确定”按钮的响应函数,代码如下:
void CEx040105fDlg::OnOK()
{
int nScale = m_Slider.GetPos();
CString strMess ;
strMess.Format("当前刻度是%d",nScale);
CDialog::OnOK();
}
(5)按下Ctrl + F5组合键创建并运⾏Ex040105f.exe,效果如图4-14所⽰。
图4-14 Ex040105f.exe效果图
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的使⽤,ListCtrl有4种显⽰⽅式:⼤图标、⼩图标、列表和详细资料。
下⾯通过⼀个实例对以上4种显⽰⽅式进⾏讨论,其中⼤图标的效果如图4-21所⽰。
具体步骤如下:
(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()
{
//…
//增加列头
m_stuList.InsertColumn(0,"姓名",LVCFMT_LEFT,100);
m_stuList.InsertColumn(1,"特长",LVCFMT_LEFT,100);
//增加内容
int nItem = m_stuList.InsertItem(0,"张三",2);
m_stuList.SetItemText(nItem,1,"热爱⾃然");
nItem = m_stuList.InsertItem(1,"李四",1);
m_stuList.SetItemText(nItem,1,"热爱科学");
nItem = m_stuList.InsertItem(2,"王五",0);
m_stuList.SetItemText(nItem,1,"热爱运动");
//读取图标信息
{
CBitmap bt ;
bt.LoadBitmap(IDB_ICON);
m_imageList.Create(32,32,ILC_COLOR24,3,1);
m_imageList.Add(&bt,RGB(216,233,236));//将RGB(216,233,236)变成透明⾊
}
{
CBitmap bt ;
bt.LoadBitmap(IDB_SMALL_ICON);
m_smallImageList.Create(16,16,ILC_COLOR24,3,1);
//设置图像
m_stuList.SetImageList(&m_imageList,LVSIL_NORMAL );
m_stuList.SetImageList(&m_smallImageList,LVSIL_SMALL );
return TRUE; // return TRUE unless you set the focus to a control
}
(5)增加⼀个按钮,ID为ID_SELECT,标题为“选中”,并为它增加响应函数。
void CEx040202Dlg::OnSelect()
{
CString strMess = "你选中了如下学⽣,他们的姓名及爱好是 \n------------ \n";
POSITION pos = m_stuList.GetFirstSelectedItemPosition();
if(NULL != pos )
{
while(NULL != pos )
{
int nItem = m_stuList.GetNextSelectedItem(pos);
strMess += m_stuList.GetItemText(nItem,0) ;//取姓名
strMess += "\t";
strMess += m_stuList.GetItemText(nItem,1) ;//取爱好
strMess += "\n";
}
AfxMessageBox(strMess);
}
}
(6)按下Ctrl + F5组合键创建并运⾏Ex040202.exe。
选中⼀个或多个学⽣后单击“选中”按钮。
(7)增加⼀个私有函数,具体代码如下:
void CEx040202Dlg::SetStyle(DWORD uStyle)
{
LONG lStyle;
lStyle = GetWindowLong(m_stuList.m_hWnd,GWL_STYLE);//获取当前窗⼝类型
lStyle &= ~LVS_TYPEMASK; //清除显⽰⽅式位
lStyle |= uStyle; //设置显⽰⽅式
SetWindowLong(m_stuList.m_hWnd,GWL_STYLE,lStyle);//设置窗⼝类型
}
void CEx040202Dlg::OnIcon()
{
SetStyle(LVS_ICON);//图标
}
void CEx040202Dlg::OnList()
{
SetStyle(LVS_LIST);//列表
}
void CEx040202Dlg::OnReport()
{
SetStyle(LVS_REPORT);//详细资料
}
void CEx040202Dlg::OnSmallIcon()
{
SetStyle(LVS_SMALLICON);//⼩图标
}
(9)按下Ctrl + F5组合键创建并运⾏Ex040202.exe,单击这四个按钮查看列表框的各种形式。
(10)为了美观加⼀个群组控件,去掉“确定”按钮,把“取消”按钮改成“关闭”按钮。