上一节讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box。组合框同样相当常见,例如,在Windows系统的控制面板上设置语言或位置时,有很多选项,用来进行选择的控件就是组合框控件。它为我们的日常操作提供了很多方便。

  组合框控件简介

  组合框其实就是把一个编辑框和一个列表框组合到了一起,分为三种:检疫(Simple)组合框、下拉式(Dropdown)组合框和下拉列表式(Drop List)组合框。下面讲讲它们的区别。

  简易组合框中的列表框是一直显示的,效果如下图:

【图】

  下拉式组合框默认不显示列表框,只有在点击了编辑框右侧的下拉箭头才会弹出列表框,列表框弹出后如下图:

【图】

  下拉列表式组合框的编辑框是不能编辑的,只能由用户在下拉列表框中选择了某项后,在编辑框中显示其文本。下拉列表式组合框如下图:

【图】

  经过上面的介绍,大家应该知道,最常用的当属下拉式组合框和下拉式列表式组合框了,它们在很多时候能使程序看起来更加专业,更简洁,让用户在进行选择操作时更方便。

  组合框被操作时会向父窗口发送通知消息,这些通知消息及其含义如下:

  CBN_CLOSEUP:组合框的列表框组件被关闭,简易组合框不会发送该通知消息。

  CBN_DBLCLK:用户在某项列表上双击鼠标,只有简易组合框才会发送该通知消息。

  CBN_DROPDOWN:组合框的列表框组件下拉,简易式组合框不会发送该通知消息。

  CBN_EDITUPDATE:在编辑框准备显示改变了的正文时发送该消息,下拉列表式组合框不会发送该消息。

  CBN_EDITCHANGE:编辑框的内容被用户改变了,与CBN_EDITUPDATE不同,该消息实在编辑框显示的正文被刷新后才发出的,下拉列表式组合框不会发送该消息。

  CBN_ERRSPACE:组合框无法申请足够的内存来容纳列表项。

  CBN_SELENDCANCEL:表明用户的选择应该取消,当用户在列表框中选择了一项,然后又在组合框控件外单击鼠标时会导致该消息的发送。

  CBN_SELENDOK:用户选择了一项,然后按了回车键或单击了下滚箭头,该消息表明用户确认了自己所做的选择。

  CBN_KILLFOCUS:组合框失去了输入焦点。

  CBN_SELCHANGE:用户通过单击或移动箭头键改变了列表的选择。

  CBN_SETFOCUS:组合框获得了输入焦点。

  

  组合框控件的创建

  MFC将组合框控件的所有操作都封装到了CComboBox类中。

  我们在对话框中加入组合框时,可以往对话框模板中拖入Combo Box控件,而后添加CComboBox类型的控件变量使用,但如果我们想在程序中动态创建的话,就要使用CComboBox类的成员函数Create了。Create函数的原型如下:

  virtual BOOL Create(

    DWORD dwStyle,

    const RECT& rect,

    CWnd* pParentWnd,

    UINT nID

  );

  大家可以看出,CComboBox类的Create成员函数同前面几个控件类的Create成员函数非常类似,dwStyle指定组合框控件的风格,rect为列表框弹出后组合框的位置和尺寸,pParentWnd是指向父窗口的指针,不能为NULL,nID指定组合框控件的ID。最后还是终点讲讲dwStyle参数。组合框控件的风格包括以下几种,并给出了相应说明:

  CBS_AUTOHSCROLL:使编辑框组件具有水平滚动的风格

  CBS_DISABLENOSCROLL:使列表框在不需要滚动时显示一个禁止的垂直滚动条

  CBS_DROPDOWN:指定一个下拉式组合框

  CBS_DROPDOWNLIST:指定一个下拉列表式组合框

  CBS_HASSTRINGS:指定一个含有字符串的自绘式组合框

  CBS_LOWERCASE:将编辑框和列表框中的所有文本都自动转换为小写字符

  CBS_NOINTEGRALHEIGHT:组合框的尺寸由应用程序而不是Windows指定,通常,由Windows指定尺寸会使列表项的某些部分隐藏起来

  CBS_OEMCONVERT:使编辑框组件中的正文可以在ANSI字符集和OEM字符集之间相互转换。这在编辑框中包含文件名时是很有用的

  CBS_OWNERDRAWFIXED:指定自绘式组合框,即由父窗口负责绘制列表框的内容,并且列表项有相同的高度

  CBS_OWNERDRAWVARIBLE:指定自绘式组合框,并且列表项有不同的高度

  CBS_SIMPLE:指定一个简易组合框

  CBS_SORT:自动对列表框组件中的项进行排序

  CBS_UPPERCASE:将编辑框和列表框中的所有文本都自动转换为大写字符。

  dwStyle参数可以是以上风格的组合。跟其他控件一样,创建时一般也还要指定WS_CHILD、WS_VISIBLE、WS_TABSTOP和WS_VSCROLL等风格。

  在对话框模板中直接添加组合框控件时,其属性页中的属性包含了以上风格,例如属性Uppercase设为True就相当于指定了CBS_UPPERCASE风格。

  CComboBox类的主要成员函数

  因为组合框是由编辑框和列表框组合而成的,所以组合框的操作和编辑框与列表框的操作有很多相似之处,同样的,CComboBox类的成员函数也和CEdit类和CListBox类的成员函数有很多相似之处,不但功能相似,甚至函数名和参数也很相似。下面大概讲解下CComboBox类的主要成员函数,更详细的内容可以参见MSDN。

  int GetCount() const;

  获取组合框控件的列表框中列表项的数量。

  

  int GetCurSel() const;

  获取组合框控件的列表框中选中项的索引,如果没有选中任何项,该函数返回CB_ERR。

  int SetCurSel(int nSelect);

  在组合框控件的列表框中选择某项。nSelect参数指定了要选择的列表项的索引,如果为-1则列表框中当前选择项被取消选中,编辑框也被清空。

  DWORD GetEditSel() const;

  获取组合框控件的编辑框中当前选择范围的起始和终止字符的位置。该函数返回一个32位数,低16位存放起始位置,高16位存放选择范围后第一个非选择字符串的位置。如果该函数用于下拉列表组合框时,会返回CB_ERR。

  BOOL SetEditSel(int nStartChar, int nEndChar);

  用于在组合框控件的编辑框中选择字符。nStartChar参数指定起始位置,nEndChar参数指定终止位置。

  DWORD_PTR GetItemData(int nIndex) const;

  获取组合框中指定项所关联的32位数据。nIndex参数指定组合框控件的列表框某项的索引(从0开始)

  int SetItemData(int nIndex, DWORD_PTR dwItemData);

  为某个指定的组合框列表项设置一个关联的32位数。nIndex参数指定要进行设置的列表项索引。dwItemData参数要关联的新值。

  

  void GetLBText(int nIndex, CString& rString) const;

  从组合框控件的列表框中获取某项的字符串。nIndex参数指定要获取字符串的列表项的索引,CString参数用于接收取到的字符串。

  int GetLBTextLen(int nIndex) const;

  获取组合框控件的列表框中某项字符串的长度。nIndex参数指定要获取字符串长度的列表项的索引。

  int GetTopIndex() const;

  获取组合框控件的列表中第一个可见项的索引。

  int SetTopIndex(int nIndex);

  将组合框控件的列表框中某个指定项设置为可见的。nIndex参数指定了该列表项的索引。该函数成功则返回0,有错误发生则返回CB_ERR。

  BOOL LimitText(int nMaxChars);

  用于限制用户在组合框控件的编辑框中能够输入的最大字节长度。nMaxChars参数指定了用户能够输入文字的最大字节长度,如果为0则长度被限制为65535个字节。

  

  int AddString(LPCTSTR lpszString);

  为组合框控件中的列表框添加新的列表项。lpszString参数是指向要添加的字符串的指针。该函数返回值如果大于等于0,那么它就是新列表项的索引,而如果有错误发生则会返回CB_ERR,如果没有足够的内存存放新的字符串则返回CB_ERRSPEACE。

  int DeleteString(UINT nIndex);

  删除组合框中指定位置的列表项。nIndex参数指定了要删除的列表项的索引。该函数的返回值如果大于等于0,那么它就是组合框中剩余列表项的数量。如果nIndex指定的索引超出了列表项的数量则返回CB_ERR。

  int FindString(int nStartAfter, LPCTSTR lpszString) const;

  在组合框控件的列表框中查找但不选中第一个包含指定前缀的列表项。nStartAfter参数指定了第一个要查找的列表项之前的那个列表项的索引。lpszString指向包含要查找的前缀的字符串。该函数的返回值如果大于等于0,那么它是匹配列表项的索引,如果查找失败则返回CB_ERR。

  int InsertString(int nIndex, LPCTSTR lpszString);

  向组合框控件的列表框中插入一个列表项。nIndex参数指定了要插入列表项的位置,lpszString参数则指定了要插入的字符串。该函数返回字符串被插入的位置,如果有错误发生则会返回CB_ERR,如果没有足够的内存存放新字符串则返回CB_ERRSPACE。

  int SelectString(int nStartAfter, LPCTSTR lpszString);

  在组合框控件的列表框中查找一个字符串,如果查找到则选中它,并将其显示到编辑框中。参数同FindString。如果字符串被查找到则返回此列表项的索引,如果查找失败则返回CB_ERR,并且当前选择项不改变。

  

  此外,CComboBox类还继承了CWnd类的成员函数GetWindowText、SetWindowText等。

  CComboBox类应用实例

  最后给大家写一个简单的实例,说明CComboBox的几个成员函数及通知消息等的使用方法。此实例实现的功能:在组合框中包含一个网站列表,切换组合框控件的列表框中选择的列表项时,将新选中的列表项的文本显示到编辑框中。下面是具体实现步骤:

  1、创建一个基于对话框的MFC工程,名称设置为"MFCComboBoxDemo".

  2、在自动生成的对话框模板IDD_MFCCOMBOBOXDEMO_DIALOG中,删除“TODO:Place dialog controls here.”静态文本控件、“确定”按钮和“取消”按钮。添加一个Combo Box控件,ID设置为IDC_WEB_COMBO,Type属性设置为Drop List,为下列列表组合框,编辑框不允许用户输入,Sort属性设为False,以取消排序显示。再添加一个静态文本控件和一个编辑框,静态文本控件的Caption属性设为“您选择的网站:”,编辑框的ID设为IDC_SEL_WEB_EDIT,Read Only属性设为True。此时的对话框模板如下图:

  3、为组合框IDC_WEB_COMBO添加CComboBox类型的控件变量m_comboWeb。

  4、在对话框初始化时,我们将站点名加入到组合框中,并默认选择第一项,那么需要修改CMFCComboBoxDemoDlg::OnInitDialog()函数为:

C++代码:

BOOL CMFCComboBoxDemoDlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 // 为组合框控件的列表框添加列表项"博客园"
m_comboWeb.AddString(_T("博客园"));
// 为组合框控件的列表框添加列表项“百度”
m_comboWeb.AddString(_T("百度"));
// 在组合框控件的列表框中索引为1的位置插入列表项“新浪”
m_comboWeb.InsertString(1, _T("新浪")); // 默认选择第一项
m_comboWeb.SetCurSel(0);
// 编辑框中默认显示第一项的文字“博客园”
SetDlgItemText(IDC_SEL_WEB_EDIT, _T("博客园")); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

  5、我们希望在组合框中选中的列表项改变时,将最新的选择项实时显示到编辑框中,那么这就要用到CBN_SELCHANGE通知消息。为列表框IDC_WEB_COMBNO的通知消息CBN_SELCHANGE添加消息处理函数CMFCComboBoxDemoDlg::OnCbnSelChangeWebCombo(),并修改如下:

C++代码:

void CMFCComboBoxDemoDlg::OnCbnSelchangeWebCombo()
{
// TODO: 在此添加控件通知处理程序代码
CString strWeb;
int nSel; // 获取组合框控件列表框中选中的索引
nSel = m_comboWeb.GetCurSel();
// 根据选中项索引获取该项字符串
m_comboWeb.GetLBText(nSel, strWeb);
// 将组合框中选中的字符串显示到IDC_SEL_WEB_EDIT编辑框中
SetDlgItemText(IDC_SEL_WEB_EDIT, strWeb);
}

  6、运行程序,弹出结果对话框,在对话框的组合框中改变选择项时,编辑框中显示会相应改变。效果如下图:

  组合框的内容就是这些了。相对于CComboBox类数量不少的成员函数来说,本节的实例只是用到了很少的几个,大家可以根据上面所讲试试其他的成员函数。

  

  

MFC编程入门之二十五(常用控件:组合框控件ComboBox)的更多相关文章

  1. 【转】VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)

    原文网址:http://www.jizhuomi.com/software/189.html 上一节鸡啄米讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常 ...

  2. VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)

    上一节鸡啄米讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常见,例如,在Windows系统的控制面板上设置语言或位置时,有很多选项,用来进行选择的控件就是 ...

  3. MFC编程入门之二十(常用控件:静态文本框)

    上一节讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组合框.图片控 ...

  4. VS2010/MFC编程入门之二十(常用控件:静态文本框)

    上一节鸡啄米讲了颜色对话框之后,关于对话框的使用和各种通用对话框的介绍就到此为止了.从本节开始鸡啄米将讲解各种常用控件的用法.常用控件主要包括:静态文本框.编辑框.单选按钮.复选框.分组框.列表框.组 ...

  5. VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)

    前面一节中,鸡啄米讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用.      列表视图控件简介 列表视图控件List Control同样比较常见, ...

  6. MFC编程入门之二十八(常用控件:列表视图控件List Control上)

    前面一节中,讲了图片控件Picture Control,本节为大家详解列表视图控件List Control的使用. 列表视图控件简介 列表视图控件List Control同样比较常见,它能够把任何字符 ...

  7. MFC编程入门之二十六(常用控件:滚动条控件ScrollBar)

    回顾上一节,讲的是组合框控件Combo Box的使用.本节详解滚动条控件Scroll Bar的相关内容. 滚动条控件简介 滚动条大家也很熟悉了,Windows窗口中很多都有滚动条.前面讲的列表框和组合 ...

  8. VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)

    回顾上一节,鸡啄米讲的是组合框控件Combo Box的使用.本节详解滚动条控件Scroll Bar的相关内容. 滚动条控件简介 滚动条大家也很熟悉了,Windows窗口中很多都有滚动条.前面讲的列表框 ...

  9. VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)

    上一节VS2010/MFC编程入门教程中鸡啄米讲了按钮控件Button.Radio Button和Check Box的基本用法,本节就继续讲按钮控件的内容,通过一个实例让大家更清楚按钮控件在实际的软件 ...

随机推荐

  1. Python对时间的转换

    1.将字符串的时间转换为时间戳 方法: a = "2013-10-10 23:40:00" 将其转换为时间数组 import time timeArray = time.strpt ...

  2. python学习笔记系列----(六)错误和异常

    python至少有2类不同的错误:语法错误(Syntax Errors)和异常(Exceptions). 8.1 语法错误 这个单词应该还是很有必要认识的,呵呵,语法错误,也叫解析错误,是我们最不愿意 ...

  3. 使用Apache Ambari管理Hadoop

    随着Hadoop越来越普及,对合适的管理平台的需求成为当前亟待解决的问题.已经有几个商业性的Hadoop管理平台,如Cloudera Enterprise Manager,但Apache Ambari ...

  4. oracle优化:避免全表扫描(高水位线)

    如果我们查询了一条SQL语句,这条SQL语句进行了全表扫描,那到底是扫描了多少个数据块呢?是表有多少数据,就扫描多少块吗?不是的.而是扫描高水位线一下的所有块.有的时候有人经常说,我的表也不大呀,怎么 ...

  5. 技巧分享:解决Word 2010当中“分页符”造成的空白行

    技巧分享:解决Word 2010当中“分页符”造成的空白行 P1:关于“分页符” 在Word当中插入“分页符”之后,后面的内容就会“更起一段”.就好像“换行符”(回车)会让后面的内容“另起一行”一样. ...

  6. Swift_UI_UILabel

    Swift_UI_UILabel import UIKit class ViewController: UIViewController { override func viewDidLoad() { ...

  7. dr.wondr博士随笔之某古旧非智能机T6XXX 恢复一例

    大家好!欢迎再次来到dr.Wonde的微博! 今次我给大家带来索尼爱立信古董机T650i的取证工作展示! 首先请出今天我们的主角索尼爱立信 T650i>> 然后在工厂模式下,连接设备,看图 ...

  8. Web Compiler

    Web Compiler The easiest and most powerful way to compile LESS, Scss, Stylus, JSX and CoffeeScript f ...

  9. QT常见数据类型操作

    平常使用QStringList,都是通过at()访问其中的元素,然后试图也通过它修改元素,编译器报错,原来要使用下标访问修改: //accessRecList.at(3)=strSimilarity; ...

  10. 安装win7的那些事

    由于win7系统只支持MBR格式的分区,如果强行将win7安装到UEFI分区方式的硬盘上将不能启动,所以,如果你要给别人的win8或者win10的OEM系统安装win7的话,记得先将重要数据备份出去, ...