首页 - 技术 - vs2010 combo_VS2010MFC编程入门教程之目录和总结

vs2010 combo_VS2010MFC编程入门教程之目录和总结

2023-09-26 18:46

VS2010/MFC编程入门教程之目录和总结

? ? ? 这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够。以此教程的知识为基础,学习VS2010/MFC较为深入的内容已非难事。作为本教程的最后一课,鸡啄米将对前面所讲内容进行目录归纳,并对这八个月加班加点的努力进行总结。

???????一、VS2010/MFC编程入门教程之目录

???????第一部分:VS2010/MFC开发环境

???????VS2010/MFC编程入门之前言 ???????VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)

???????第二部分:VS2010/MFC应用程序框架

???????VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架) ???????VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构) ???????VS2010/MFC编程入门之四(MFC应用程序框架分析) ???????VS2010/MFC编程入门之五(MFC消息映射机制概述)

???????第三部分:对话框

???????VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性) ????? ?VS2010/MFC编程入门之七(对话框:为对话框添加控件) ???????VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量) ???????VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数) ???????VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序) ???????VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程) ???????VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示) ???????VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍) ???????VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示) ???????VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示) ???????VS2010/MFC编程入门之十六(对话框:消息对话框) ???????VS2010/MFC编程入门之十七(对话框:文件对话框) ???????VS2010/MFC编程入门之十八(对话框:字体对话框) ???????VS2010/MFC编程入门之十九(对话框:颜色对话框)

???????第四部分:常用控件

???????VS2010/MFC编程入门之二十(常用控件:静态文本框) ???????VS2010/MFC编程入门之二十一(常用控件:编辑框Edit Control) ???????VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box) ???????VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例) ???????VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox) ???????VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box) ???????VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar) ???????VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control) ???????VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上) ???????VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下) ???????VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上) ???????VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下) ???????VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上) ???????VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)

???????第五部分:菜单、工具栏与状态栏

???????VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解) ???????VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用) ???????VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类) ???????VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用) ???????VS2010/MFC编程入门之三十八(状态栏的使用详解)

???????第六部分:文档、视图和框架

???????VS2010/MFC编程入门之三十九(文档、视图和框架:概述) ???????VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系) ???????VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)

???????第七部分:MFC常用类

???????VS2010/MFC编程入门之四十二(MFC常用类:CString类) ???????VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类) ???????VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer) ???????VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类) ???????VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)

???????第八部分:字体和文本输出

???????VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类) ???????VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)

???????第九部分:图形图像

???????VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数) ???????VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen) ???????VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)

???????第十部分:Ribbon界面开发

???????VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架) ???????VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件) ???????VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)

? ? ? ?

?????? 学会了VS2010/MFC编程,很多人就开始喜欢研究MFC了,但是提醒大家不要忘了根本,即C++语言。从《鸡啄米C++编程入门系列》和《VS2010/MFC编程入门教程》这两套学习教程的受欢迎程度,鸡啄米感觉大家有些忽视C++的学习,更喜欢应用性强的MFC。在你能熟练使用MFC后,最好再认真学学C++,提高C++水平才能真正让你的编程功力上一个台阶。

? ? ? ?上一节鸡啄米讲了列表框控件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_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则长度被限制为65535个字节。

???????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。此时的对话框模板如下图:

?????? 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?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???}??

?????? 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?=?m_comboWeb.GetCurSel(); ?? ????//?根据选中项索引获取该项字符串???????m_comboWeb.GetLBText(nSel,?strWeb); ?? ????//?将组合框中选中的字符串显示到IDC_SEL_WEB_EDIT编辑框中???????SetDlgItemText(IDC_SEL_WEB_EDIT,?strWeb); ?? }??

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

???????组合框的内容就是这些了。相对于CComboBox类数量不少的成员函数来说,本节的实例只是用到了很少的几个,大家可以根据上面所讲试试其他的成员函数。有问题欢迎继续到鸡啄米来交流讨论。

修改Combobox控件的

Sort属性为

False。