欢迎进入广州凡科互联网科技有限公司网站
全国服务热线
4000-399-000
VS2010/MFC程序编写新手入门之二十五(常见控制:
时间: 2021-02-14 07:32 浏览次数:
上一节鸡啄米讲了目录框控制ListBox的应用,这节关键解读组成框控制Combo Box。组成框一样非常普遍,比如,在Windows系统软件的操纵控制面板上设定語言或部位时,有许多选择项,用于

 上一节鸡啄米讲了目录框控制ListBox的应用,这节关键解读组成框控制Combo Box。组成框一样非常普遍,比如,在Windows系统软件的操纵控制面板上设定語言或部位时,有许多选择项,用于开展挑选的控制便是组成框控制。它为大家的平时实际操作出示了许多便捷。

  组成框控制介绍

  组成框实际上便是把一个编写框和一个目录框组成来到一起,分成三种:简单(Simple)组成框、往下拉式(Dropdown)组成框和往下拉目录式(Drop List)组成框。下边讲下他们的差别。

 简单组成框中的目录框是一直显示信息的,实际效果以下图:

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

 往下拉式组成框默认设置无法显示目录框,仅有在点一下了编写框右边的往下拉箭头符号才会弹出来目录框,目录框弹出来后以下图:

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

 往下拉目录式组成框的编写框不是能编写的,只有由客户在往下拉目录框选中择了某项后,在编写框中显示信息其文字。往下拉目录式组成框以下图:

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

 历经上边的详细介绍,大伙儿应当了解,最经常用确当下属拉式组成框和往下拉目录式组成框了,他们在许多情况下能使程序看上去更技术专业,更简约,让客户在开展挑选实际操作时更便捷。

  组成框被实际操作时候向父对话框推送通告信息,这种通告信息以及含意以下:

  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_OWNERDRAWVARIABLE:特定自绘式组成框,而且目录项有不一样的高宽比
  CBS_SIIMPLE:特定一个简单组成框
  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则长短被限定为6553五个字节数。

  int AddString(LPCTSTR lpszString);
  为组成框控制中的目录框加上新的目录项。lpszString主要参数就是指向要加上的标识符串的指针。该涵数的回到值假如超过相当于0,那麼它便是新目录项的数据库索引,而假如有不正确产生则会回到CB_ERR,假如沒有充足的运行内存储放新标识符串则回到CB_ERRSPACE。

  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工程项目,名字设定为 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。这时的会话框模版以下图:

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

  3. boWeb。

  4. 在会话框原始化时,大家将站训话添加到组成框中,并默认设置挑选第一项,那麼必须改动CExample25Dlg::OnInitDialog()涵数为:

C++编码 BOOL CExample25Dlg::OnInitDialog()   {    CDialogEx::OnInitDialog();      // Add  About...  menu item to system menu.      // IDM_ABOUTBOX must be in the mand 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    // 为组成框控制的目录框加上目录项 鸡啄米   &boWeb.AddString(_T( 鸡啄米 ));    // 为组成框控制的目录框加上目录项 百度搜索   &boWeb.AddString(_T( 百度搜索 ));    // 在组成框控制的目录框中数据库索引为1的部位插进目录项 新浪网   &boWeb.InsertString(1, _T( 新浪网 ));      // 默认设置挑选第一项   &boWeb.SetCurSel(0);    // 编写框中默认设置显示信息第一项的文本 鸡啄米    SetDlgItemText(IDC_SEL_WEB_EDIT, _T( 鸡啄米 ));      return TRUE; // return TRUE unless you set the focus to a control   } 

  5. 大家期待在组成框选中中的目录项更改时,将全新的挑选项即时显示信息到编写框中,那麼这就需要采用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 =&boWeb.GetCurSel();    // 依据选定项数据库索引获得此项标识符串   &boWeb.GetLBText(nSel, strWeb);    // 将组成框选中中的标识符串显示信息到IDC_SEL_WEB_EDIT编写框中    SetDlgItemText(IDC_SEL_WEB_EDIT, strWeb);   } 

  6. 运作程序,弹出来結果会话框,在会话框的组成框中更改挑选项时,编写框中的显示信息会相对更改。实际效果图以下:

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

 组成框的內容便是这种了。相对性于CComboBox类总数很多的组员涵数来讲,这节的案例仅仅采用了非常少的好多个,大伙儿能够依据上边所说试一下别的的组员涵数。不太好热烈欢迎再次到鸡啄米来沟通交流探讨。

VS2010/MFC程序编写新手入门之二十四(常见控制:目录框控制ListBox) (:17)

VS2010/MFC程序编写新手入门之二十三(常见控制:按键控制的程序编写案例) (:59)

VS2010/MFC程序编写新手入门之二十二(常见控制:按键控制Button、Radio Button和Check Box) (:18)

VS2010/MFC程序编写新手入门之二十一(常见控制:编写框Edit Control) (:31)

VS2010/MFC程序编写新手入门之二十(常见控制:静态数据文字框) (:38)

VS2010/MFC程序编写新手入门之十九(会话框:色调会话框) (:10)

VS2010/MFC程序编写新手入门之十八(会话框:字体样式会话框) (:46)

VS2010/MFC程序编写新手入门之十七(会话框:文档会话框) (:21)

VS2010/MFC程序编写新手入门之十六(会话框:信息会话框) (:18)

VS2010/MFC程序编写新手入门之十五(会话框:一般特性页会话框的建立及显示信息) (:6)


1楼. 吴克难的blog 学得物品了,。感谢时尚博主共享。 2012/6/16 10:58:14 回应该留言板留言 2楼. 小云子 2012/6/16 16:38:53 回应该留言板留言 3楼. 小老翁 原先时尚博主也是搞技术性的!鸡啄米 于 :28 回应是啊,同行业啊 2012/6/16 16:52:28 回应该留言板留言 4楼. 屠龙 非常好,确实是技术性出生的…… 2012/6/16 16:54:30 回应该留言板留言 5楼. 蓝颜 手里有现有的能够多顾客端的闲聊源代码吗?呵呵呵,有点儿急用呢鸡啄米 于 :51 回应不太好含意,我这儿都没有 2012/6/17 9:03:17 回应该留言板留言 6楼. 英国深海鱼油 不知道不觉都25接了 2012/6/17 10:53:10 回应该留言板留言 7楼. 祝北平blog 有点儿 看不 太懂 2012/6/17 21:27:18 回应该留言板留言 8楼. 过路人甲 粗浅易懂,十分合适新手鸡啄米 于 :00 回应期待能帮上大量的学习培训程序编写者 2012/7/31 14:53:38 回应该留言板留言 9楼. qwesa ON_CBN_SELCHANGE:When processing this message, the text in the edit control bo box can only be retrieved via GetLBText or another similar function. GetWindowText cannot be used.
鸡啄米 于 :48 回应msdn上是那样说的,可是用GetWindowText我都没碰到顾及题。但是防止万一,還是依据msdn的叫法开展了改动。
很谢谢这名朋友的提示,根据大伙儿的提议和提示因为我学得了很多。再度谢谢!秦风 于 :33 回应GetWindowText:因为我应用过这一涵数,出错。沒有的组员涵数,汗啊! 2012/8/8 12:45:25 回应该留言板留言 10楼. HelloWorld 您好,加上组成框组员为何不立即用特性中的Data加上?那样更形象化些,并且那样也全自动加上了Index鸡啄米 于 :33 回应我这儿是以便演试组员涵数的应用方式。
假如数据信息是静态数据的,是固定不动的好多个数据信息,能够在data特性里加上 2012/12/2 18:48:27 回应该留言板留言 11楼. waiheker 如何在data特性中加上好几个数据信息?鸡啄米 于 :15 回应好几个数据信息中间用;隔开开 2013/1/2 18:07:11 回应该留言板留言 12楼. cl bo box 里的标识符串显示信息到标识页的会话框的edit bo box和edit box共行一个会话框中,用您的编码能够,但是我觉得在同一个会话框中,咋办啊?搞了二天,都没搞清楚,求具体指导啊?鸡啄米 于 :58 回应能够在会话框类中出示插口涵数设定以往,还可以根据全局性自变量,自然前面一种藕合性低些,实际状况实际剖析cl 于 :31 回应感谢老师傅,我调节了一下,
CString strWeb;
int nSel;

// 获得组成框控制的目录框选中中项的数据库索引
nSel = m_comboWeb.GetCurSel();
// 依据选定项数据库索引获得此项标识符串
m_comboWeb.GetLBText(nSel, strWeb);
// 将组成框选中中的标识符串显示信息到IDC_SEL_WEB_EDIT编写框中

发觉之上的编码都一切正常,标识符串能够传入strWeb中,便是
SetDlgItemText(IDC_SEL_WEB_EDIT, strWeb); bo框在父对话框中,tab标识建在在父对话框中,edit框在tab页的子会话框中。我这一
OnCbnSelchangeWebCombo()涵数是在父对话框中写的,可便是不可以把strWeb发送给edit显示信息,因为我用过在tab的哪个子会话框中转化成OnCbnSelchangeWebCombo(),boWeb是待定义的标识符,因为我包括了父会话框的头文档的啊。因为我用过给edit界定标识符串自变量的方式,在网上找的传送涵数的法,都也没试出去。哎,晕啊,弟子简直学艺不精,丢老师傅的人啊
2013/1/24 16:33:01 回应该留言板留言 13楼. cl 老师傅,全局性自变量extern 和插口涵数因为我试了,将会就是我资质证书太差吧,总之是各种各样不正确,各种各样烦闷啊wegen 于 :53 回应 我先说一下难题的所属:倘若建立了一身高会话框kidDLG,加上了一个ID为IDC_EDIT1的编写框,随后你一直在原会话框的信息解决涵数OnCbnSelchangeWebCombo()里写了SetDlgItemText(IDC_EDIT, strWeb);;发觉strWeb的标识符串內容沒有传进子会话框的编写框,我认为它是由于在一个会话框里不可以立即引入别的会话框的ID,会话框是一个实体模型,能够有许多目标,立即引入得话是找不着实际要引入哪个。
因此我的作法是在本来会话框的头文档加上子会话框类的目标比如kid_wegen,随后将SetDlgItemText(IDC_EDIT, strWeb)改为kid_wegen.SetDlgItemText(IDC_EDIT, strWeb)便可以了。 2013/1/25 9:49:09 回应该留言板留言 14楼. 千池 再次学习培训 2013/1/29 14:19:10 回应该留言板留言 15楼.  2013/4/16 10:53:49 回应该留言板留言 16楼. 落草 bo box特性Data加上的数据信息如何去引入它呢求出 于 :48 回应因为我碰到一样的难题,例如二选一“男;女;”运作后在往下拉框里没看到能够挑选的。文文lft 于 :33 回应哪个分号务必是英语键入法下键入 不然data的数据信息按回车键以后全都沒有了 2014/7/30 21:08:11 回应该留言板留言 17楼. 11111 时尚博主!你好!ASSERT((IDM_ABOUTBOX 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX 0xF000); 这几句的功效是啥?IDM_ABOUTBOX、IDS_ABOUTBOX又各自指的是啥,是包括在哪儿块头文档中的宏界定? 2014/9/3 18:37:57 回应该留言板留言 18楼. 求出 老师傅您好,问提来啦:
1: m_Combo1.AddString(_T( 英国 ));
m_Combo1.AddString(_T( 我国 ));
m_Combo1.InsertString(1, _T( 法国 ));运作只显示信息第一个,往下拉框沒有此外二个是什么原因啊?
2:例如仅有小量的情况下能够立即在“数据信息”特性栏里键入“男;女;”,可是运作的情况下为何沒有出去实际效果呢?(便是沒有出現男和女能够挑选)。小白,多多的指导! 2014/10/13 21:47:40 回应该留言板留言 19楼. lyt 编译程序出错:
SetCurSel is not a menber of ATL::CStringT BaseType,StringTraits


2016/1/18 11:26:49 回应该留言板留言 20楼. 陈俊伟 近期有一个作用将我疑惑住了:
1. 有一个button,点一下后,必须动态性转化成一个CComboBox。
应当怎样为动态性转化成的CComboBox加上恶性事件呢?
2016/5/9 9:03:41 回应该留言板留言 21楼. 张饿饿的猫 CComboBox heCComboBoxEX非常容易弄混,以前设定自变量的情况下没留意就搞错了

CComboBoxEX 类尽管也是有AddString涵数 可是其实不适用 ,程序一运作便会出错

也有便是组成框室内空间不可以设置很小 ,不然出不上往下拉目录 2016/6/1 15:25:19 回应该留言板留言 22楼. 小白 CComboBox SetWindowText 不了功
type早已是dropdown了 2016/10/29 10:21:01 回应该留言板留言 23楼. zsz 我想问一下该控制怎样在单文本文档方式中完成呢 2016/10/29 15:20:13 回应该留言板留言 24楼. hackerl 谢谢鸡啄米!讲的很详尽,非常合适初学者学习培训!问一下,vs2019早已撤销MFC的适用了没有?我升級了之后如何找不着了呢?程序编写小伙子子 于 2020/3/17 11:44:25 回应你需要自身加上
程序编写小伙子子 于 2020/3/17 11:45:04 回应百度搜索一哈有实例教程 2019/4/22 16:20:18 回应该留言板留言

网页链接(选填)

认证(*)

文章正文(*)(留言板留言最多篇幅:1000)

记牢我,下一次回应时无需再次键入本人信息内容



Copyright © 广州凡科互联网科技有限公司 版权所有 粤ICP备10235580号
全国服务电话:4000-399-000   传真:021-45545458
公司地址:广州市海珠区工业大道北67号凤凰创意园