01.目录

目录

  • 01.目录
  • 02.控件介绍
  • 03.控件的消息通知函数
  • 04.创建组合框控件及成员函数介绍
    • 4.1 组合框的创建
    • 4.2 CComboBox类的主要成员函数
  • 05.应用实例
  • 06.总结

02.控件介绍

组合框控件是我们工作中用得很频繁的一个控件,其实就是把一个编辑框和列表框组合在一起。
适用范围:当你有多个同级选项时,你又不想创建很多个单选框按钮,这时,组合框就能帮你完成这个复杂的创建过程。

组合框一共分为三种类型:

  • 简易(Simple)组合框
  • 下拉式(Dropdown)组合框
  • 下拉列表式(Drop List)组合框

    很明显,第一种用得最少 ,第二种和第三种用得相较来说比第一种多。

PS:图片来源于网络,侵权即删。

03.控件的消息通知函数

当我们操作组合框控件时,为了响应我们的操作,MFC定义了一些消息响应函数,发送给父窗口来响应我们的操作:比如改变箭头对应索引值等。
下面列举出来:

  • CBN_CLOSEUP:组合框的列表框组件被关闭,简易组合框不会发送该通知消息
  • CBN_DBLCLK:用户在某列表项上双击鼠标,只有简易组合框才会发送该通知消息
  • CBN_DROPDOWN:组合框的列表框组件下拉,简易式组合框不会发送该通知消息
  • CBN_EDITUPDATE:在编辑框准备显示改变了的正文时发送该消息,下拉列表式组合框不会发送该消息
  • CBN_EDITCHANGE:编辑框的内容被用户改变了,与CBN_EDITUPDATE不同,该消息是在编辑框显示的正文被刷新后才发出的,下拉列表式组合框不会发送该消息
  • CBN_ERRSPACE:组合框无法申请足够的内存来容纳列表项
  • CBN_SELENDCANCEL:表明用户的选择应该取消,当用户在列表框中选择了一项,然后又在组合框控件外单击鼠标时就会导致该消息的发送
  • CBN_SELENDOK:用户选择了一项,然后按了回车键或单击了下滚箭头,该消息表明用户确认了自己所作的选择
  • CBN_KILLFOCUS:组合框失去了输入焦点
  • CBN_SELCHANGE:用户通过单击或移动箭头键改变了列表的选择
  • CBN_SETFOCUS:组合框获得了输入焦点

通过上面这些消息响应函数,我们能够方便、简洁的完成一些功能。

04.创建组合框控件及成员函数介绍

这里我主要写用代码创建的这一个,拖拽的方法是第二种,我们通过案例来了解,更直观。

4.1 组合框的创建

//这是创建组合框函数的原型
virtual BOOL Create(DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID
);

参数介绍:

  • 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_OWNERDRAWVARIABLE:指定自绘式组合框,并且列表项有不同的高度
CBS_SIIMPLE:指定一个简易组合框
CBS_SORT:自动对列表框组件中的项进行排序
CBS_UPPERCASE:将编辑框和列表框中的所有文本都自动转换为大写字符
dwStyle参数可以是以上风格的组合。跟其他控件一样,创建时一般也还要指定WS_CHILD、WS_VISIBLE、WS_TABSTOP和WS_VSCROLL等风格。
在对话框模板中直接添加组合框控件时,其属性页中的属性包含了以上风格,例如属性Uppercase设为True就相当于指定了CBS_UPPERCASE风格。

4.2 CComboBox类的主要成员函数

因为组合框是编辑框和列表框组合的,所以有很多成员函数与他们相似,甚至函数明都一样

  1. 获取组合框控件的列表框中列表项的数量。
    int GetCount( ) const;

  2. 获取组合框控件的列表框中选中项的索引,如果没有选中任何项,该函数返回CB_ERR。
    int GetCurSel( ) const;

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

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

  5. 用于在组合框控件的编辑框中选择字符。nStartChar参数指定起始位置,nEndChar参数指定终止位置。
    BOOL SetEditSel(int nStartChar,int nEndChar);

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

  7. 为某个指定的组合框列表项设置一个关联的32位数。nIndex参数指定要进行设置的列表项索引。dwItemData参数指定要关联的新值。
    int SetItemData(int nIndex,DWORD_PTR dwItemData);

  8. 从组合框控件的列表框中获取某项的字符串。nIndex参数指定要获取字符串的列表项的索引,CString参数用于接收取到的字符串。
    void GetLBText(int nIndex,CString& rString) const;

  9. 获取组合框控件的列表框中某项的字符串长度。nIndex参数指定要获取字符串长度的列表项的索引。
    int GetLBTextLen(int nIndex) const;

  10. 获取组合框控件的列表框中第一个可见项的索引。
    int GetTopIndex( ) const;

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

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

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

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

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

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

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

此外,CComboBox类还继承了CWnd类的成员函数GetWindowText、SetWindowText等
这里就不列举出来了,太多,msdn上面都有,感兴趣可以自己去看下

05.应用实例

功能:在组合框中包含一个网站列表,切换组合框控件的列表框中选择的列表项时,将新选中的列表项的文本显示到编辑框中。下面是具体实现步骤:

  1. 创建一个基于对话框的MFC工程,名称设置为“Example25”。
  2. 在自动生成的对话框模板IDD_EXAMPLE25_DIALOG中,删除“TODO: Place dialog controls here.”静态文本控件、“OK”按钮和“Cancel”按钮。添加一个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. 在对话框初始化时,我们将站点名加入到组合框中,并默认选择第一项,那么需要修改CExample25Dlg::OnInitDialog()函数为:

C++:

BOOL CExample25Dlg::OnInitDialog()
{   CDialogEx::OnInitDialog();   // Add "About..." menu item to system menu.   // IDM_ABOUTBOX must be in the system command range.   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);   }   }   // Set the icon for this dialog.  The framework does this automatically   //  when the application's main window is not a dialog   SetIcon(m_hIcon, TRUE);         // Set big icon   SetIcon(m_hIcon, FALSE);        // Set small icon   // TODO: Add extra initialization here   // 为组合框控件的列表框添加列表项“谷歌”   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;  // return TRUE  unless you set the focus to a control
}
  1. 我们希望在组合框中选中的列表项改变时,将最新的选择项实时显示到编辑框中,那么这就要用到CBN_SELCHANGE通知消息。为列表框IDC_WEB_COMBO的通知消息CBN_SELCHANGE添加消息处理函数CExample25Dlg::OnCbnSelchangeWebCombo(),并修改如下:

C++:

void CExample25Dlg::OnCbnSelchangeWebCombo()
{   // TODO: Add your control notification handler code here   CString strWeb;   int nSel;   // 获取组合框控件的列表框中选中项的索引   nSel = m_comboWeb.GetCurSel();   // 根据选中项索引获取该项字符串   m_comboWeb.GetLBText(nSel, strWeb);   // 将组合框中选中的字符串显示到IDC_SEL_WEB_EDIT编辑框中   SetDlgItemText(IDC_SEL_WEB_EDIT, strWeb);
}
  1. 然后运行对话框即可。

06.总结

MFC可能开始用着不是很习惯,但是你用久了就会发现,好多东西都为我们封装好了,其实不比QT差,我感觉唯一的不好就是微软的东西对其他平台支持不友好。
有什么问题可以评论区或者私我交流,以上就是Combo Box控件的全部内容啦!

版权声明:转载请注明出处,谢谢!

【MFC】学习笔记:常用控件之组合框(Combo Box)相关推荐

  1. 鸡啄米之VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)

    目录 一.目的: 1.点击列表框某个变量后,编辑框就显示出来这个变量名字 一.参考: 1.VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox) ①总结:good:亲测有效,适合多 ...

  2. Android学习:常用控件

    Android学习:常用控件 学习要点:掌握文本框.编辑框.按钮.单选按钮.复选框等基本控件的用法 控件是Android应用程序中用户界面的重要组成元素,正是因为Android应用程序提供了很多具有不 ...

  3. PyQt5学习笔记- PyQt5控件介绍

    PyQt5控件介绍 一.控件的概念 二.控件结构继承图 一.控件的概念 一个程序界面上的各个独立的元素(一块矩形区域) 具备不同的功能:用户点击.接受用户输入.展示内容.存放其他控件 初始常用控件:按 ...

  4. 组合框combo box

    Type:  指定组合框的类型.可以使用的类型如下: Simple:创建包括编辑框控件和列表框的简单组合框,其中编辑框控件用来接受用户的输入. Dropdown:创建下拉组合框.该类型与简单组合框类似 ...

  5. VC学习笔记 -单选按钮控件(Ridio Button)的使用

    在VC++编程过程中,查资料是一个苦差事,案边放了一摞书左翻右翻好是烦人.一赌气就把一些常用的小技巧自己总结了一下,虽费了些功夫,但对以后编程很有好处.现拿出来与大家共享,以后积累多了,作一个CHM电 ...

  6. Asp.net控件开发学习笔记(三)-控件开发基础

    封装      在asp.net中,控件被分为两类.用户控件和自定义服务器控件.前者就是我们经常用来将一些可复用的内容封装成的.ascx文件.这里主要研究后者. 创建自定义服务器控件      创建自 ...

  7. IOS开发学习笔记018- 一般控件的使用

    1.移动 2.动画 3.缩放 3.旋转 4.简化代码 5.总结 UIButton 的两种状态 normal highlighted  1.移动 OC语法规定:不允许直接修改某个对象中结构体属性的成员. ...

  8. android菜鸟学习笔记13----Android控件(二) 自定义控件简单示例

    有时候,可能觉得系统提供的控件太丑,就会需要自定义控件来实现自己想要的效果. 以下主要参考<第一行代码> 1.自定义一个标题栏: 系统自带的标题栏很丑,且没什么大的作用,所以我们之前会在o ...

  9. MFC学习笔记--组合框Combo Box一些操作

    Combo Box对应的控制变量CComboBox m_CbDrive; 一.设置组合框中编辑框文本 1.组合框中编辑框设置文字 m_CbDrive.SetWindowText("请选择盘符 ...

最新文章

  1. 手机选择,2014年10月底
  2. Python培训教程分享:Python中选择结构是什么
  3. 3.请执行命令取出linux中eth0的IP地址(考试题答案系列)
  4. LeetCode 45. 跳跃游戏 II(贪心/BFS,难)
  5. 在JavaScript中以Hours24:Minutes:Seconds格式获取当前时间
  6. 手机html文档,手机文档html能删除吗
  7. html5自定义组件样式,Taro 自定义组件样式不生效及解决方案
  8. IBM GTS部门或有重大调整,最快本周见分晓
  9. 前端之JQuery:JQuery属性操作
  10. 有关top命令中的%st,sar命令中的%steal .
  11. PSFTP上传文件到服务器
  12. 网易云ios android 自定义消息,网易云信快速集成定制以及消息类型自定义
  13. 编程小知识之 struct 构造函数(C#)
  14. python里面的冒号_python里的冒号
  15. 命令查看(获取)本机IP地址
  16. 医院HIS预约系统源码丨同城排队预约下单微信小程序公众号 his源码
  17. 云服务器系统么开始bios,云服务器怎么进入bios
  18. 给自己的网站装上SSL证书
  19. (vue) 前端实现下载本地Excel模板
  20. 开发和常用工具推荐清单

热门文章

  1. Linux - tree 生成目录树「Note」
  2. 程序的指令和数据为什么分开存放?
  3. 运维自动化管理服务器 CheungSSH
  4. php下载文件并重命名,通过php下载文件并重命名
  5. 脱欧导致IT公司在英国开展业务充满变数
  6. 富士康c语言试卷答案,富士康笔试真题分享
  7. 《C程序员:从校园到职场》出版预告(2):从“百花齐放”到“一枝独秀”
  8. 耳机接口规则_耳机小白必读 一分钟看懂什么是TRS接口
  9. Linux内核分析(七)系统调用execve处理过程
  10. ACwing每日一题3565暴力 绝对值不等式 中位数思维