VC常用控件的使用

原文地址:【转】VC常用控件的使用 作者:keen

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.编辑框

用户可以在编辑框中输入文字、数字,并能剪切、粘贴、拷贝、删除输入字符。编辑框获得焦点时,就会出现一个闪动的插入符,指明当前插入的位置。

¡  Auto Hscroll:选中此属性后,当用户输入的内容超过编辑框后,编辑框会自动滚动;没有选中时,当用户输入的内容超过编辑框后,无法再输入。

¡  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("你输入的是%dn",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";

 

    AfxMessageBox(strMess);

}

(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);

       AfxMessageBox(strMess);

    }

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);

    AfxMessageBox(strMess);

 

    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所示。

 

图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()

 

    //…

    //增加列头

    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_smallImageList.Add(&bt,RGB(216,233,236));//将RGB(216,233,236)变成透明色

    }  

    //设置图像

    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);//设置窗口类型 

}

(8)增加4个按钮,ID分别为IDC_ICON、IDC_LIST、IDC_REPORT、IDC_SMALL_ICON,标题分别是图标、列表、详细资料和小图标。为它们增加以下响应函数:

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)为了美观加一个群组控件,去掉“确定”按钮,把“取消”按钮改成“关闭”按钮。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值