第 29 章
成员函数声明如下:
int SelectString(int nStartAfter,LPCTSTR lpszItem);
该函数仅适用于单选择列表框,用来选择与指定字符串相匹配的列表项。该函数会滚动
列表框以使选择项可见。参数的意义及搜索的方法与函数FindString 类似。如果找到了匹配
的项,函数返回该项的索引,如果没有匹配的项,函数返回LB_ERR 并且当前的选择不被改
变。
15.GetSelCount()函数
该成员函数声明如下:
int GetSelCount() const;
该函数仅用于多重选择列表框,它返回选择项的数目,若出错函数返回LB_ERR。
16.SetSel()函数
该成员函数声明如下:
int SetSel(int nIndex,BOOL bSelect = TRUE);
该函数仅适用于多重选择列表框,它使指定的列表项选中或落选。参数nIndex 指定了列
表项的索引,若为-1,则相当于指定了所有的项。参数bSelect 为TRUE 时选中列表项,否则
使之落选。若出错则返回LB_ERR。
17.GetSelItems()函数
该成员函数声明如下:
int GetSelItems(int nMaxItems, LPINT rgIndex) const;
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·122·
该函数仅用于多重选择列表框,用来获得选中的项的数目及位置。参数nMaxItems 说明
了参数rgIndex 指向的数组的大小。参数rgIndex 指向一个缓冲区,该数组是一个整型数组,
用来存放选中的列表项的索引。函数返回放在缓冲区中的选择项的实际数目,若出错函数返
回LB_ERR。
18.SetItemRange()函数
该成员函数声明如下:
int SetItemRange(BOOL bSelect,int nFirstItem,int nLastItem);
该函数仅用于多重选择列表框,用来使指定范围内的列表项选中或落选。参数nFirstItem
和nLastItem 指定了列表项索引的范围。如果参数bSelect 为TRUE,那么就选择这些列表项,
否则就使它们落选。若出错函数返回LB_ERR。
技巧:实现列表框的提示条(可以显示完整的列表框的项目文本)
用一个CListBox 派生类实现宿主(owner-draw)列表框,这个列表框的项目宽度超过了列表框本身
的宽度,因此当鼠标指针指向大宽度的列表框项时,希望显示一个类似Toolbar 的提示窗口,在窗口
中显示完整的列表框项目文本。
附带光盘下的工程演示列表框提示条的实现,主要是创建了可重用窗口类CPopupText。
CPopupText 类会根据提示文本的长度自己决定弹出窗口的大小。它的字体默认值与状态行显示字体
相同(由SystemParcomtersInfo(SPI_GETNONCLIENTMETRICS)返回的 NONCLIENTMETRICS 结构
成员 lfStatusFont 定义),设置 SW_SHOWNA 是很重要的,因为你不想使提示窗口为活动窗口,而
只是显示它。另外,CPopupText 还提供一个专门的函数CPopupText::ShowDelayed,它的功能是在显
示提示窗口之前设置一个毫秒级延时,如果延时为零,则立刻显示提示窗口,你可以使用这个特点来
替代对ShowWindow 的调用。如果要隐藏提示窗口或取消ShowDelayed,调用CPopupText::Cancel。
实例5-2:实现列表框的提示条实例。源代码在光盘中“\05\实例5-2\ListTest”目录下。
5.6 组合框(Combo box)控件
5.6.1 组合框控件的使用
组合框是一种传统控件,把一个编辑框和一个单选择列表框结合在了一起。用户既可以
在编辑框中输入,也可以从列表框中选择一个列表项来完成输入。组合框分为简易式
(Simple)、下拉式(Dropdown)和下拉列表式(Drop List)3 种。简易式组合框包含一个编
辑框和一个总是显示的列表框。下拉式组合框同简易式组合框类似,二者的区别在于单击下
拉箭头后是否会弹出列表框。下拉列表式组合框也有一个下拉的列表框,但它的编辑框是只
读的,不能输入字符。
Windows 中比较常用的是下拉式和下拉列表式组合框,在集成开发环境(IDE)中就大
枫叶文学网www.fywxw.com
第5 章 常用控件
·123·
量使用了这两种组合框。二者都具有占地小的特点,这在界面日益复杂的今天是十分重要的。
下拉列表式组合框的功能与列表框类似。下拉式组合框的典型应用是作为记事列表框使用,
既把用户在编辑框中敲入的东西存储到列表框组件中,这样当要重复同样的输入时,可以从
列表框组件中选取而不必在编辑框组件中重新输入。在集成开发环境(IDE)中的Find 对话
框中就可以找到一个典型的下拉式组合框。
应用一个列表框控件时,主要应遵循下列原则。
? 在创建组合框时指定CBS_DROPDOWNLIST 风格。
? 要限制列表项的数目,以防止内存不够。
? 如果在编辑框中输入的字符串不能与列表框组件中的列表项匹配,那么应该把该字符
串chā入到列表框中的0 位置处。最老的项处于列表的末尾。如果列表项的数目超出了
限制,则应把最老的项删除。
? 如果在编辑框中输入的字符串可以与列表框组件中的某一项完全匹配,则应该先把该
项从列表的当前位置删除,然后在将其chā入列表的0 位置处。
组合框控件会向父窗口发送控件通知消息,主要的通知消息如表5-12 所示的。
表5-12 组合框控件的通知消息
消息 含义
CBN_CLOSEUP 组合框的列表框组件被关闭,简易式组合框不会发出该消息
CBN_DBLCLK 用户在某列表项上双击鼠标,只有简易式组合框才会发出该消息
CBN_DROPDOWN 组合框的列表框组件下拉,简易式组合框不会发出该消息
CBN_EDITCHANGE
编辑框的内容被用户改变了,与CBN_EDITUPDATE 不同,该消息是
在编辑框显示的正文被刷新后才发出的,下拉列表式组合框不会发出
该消息
CBN_EDITUPDATE
在编辑框准备显示改变了的正文时发送该消息,下拉列表式组合框不
会发出该消息
CBN_ERRSPACE 组合框无法申请足够的内存来容纳列表项
CBN_SELENDCANCEL
表明用户的选择应该取消,当用户在列表框中选择了一项,然后又在
组合框控件外单击鼠标时就会导致该消息的发送
CBN_SELENDOK
用户选择了一项,然后按了回车键或单击了下滚箭头,该消息表明用
户确认了自己所作的选择
CBN_KILLFOCUS 组合框失去了输入焦点
CBN_SELCHANGE 用户通过单击或移动箭头键改变了列表的选择
CBN_SETFOCUS 组合框获得了输入焦点
组合框控件封装在MFC 的CComboBox 类中。需要指出的是,虽然组合框是编辑框和列
表框的组合,但是CComboBox 类并不是CEdit 类和CListBox 类的派生类,而是CWnd 类的
派生类。
CComboBox 的成员函数Create 负责创建组合框,该函数的声明如下:
BOOL Create(DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID);
参数dwStyle 指定了组合框控件的风格,如表5-13 所示,dwStyle 可以是这些风格的组
合。rect 说明的是列表框组件下拉后组合框的位置和尺寸。pParentWnd 指向父窗口,该参数
不能为NULL。nID 则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE。
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·124·
表5-13 组合框的风格
风格 含义
CBS_AUTOHSCROLL 使编辑框组件具有水平滚动的风格
CBS_DROPDOWN 指定一个下拉式组合框
CBS_DROPDOWNLIST 指定一个下拉列表式组合框
CBS_HASSTRINGS 指定一个含有字符串的自绘式组合框
CBS_OEMCONVERT
使编辑框组件中的正文可以在ANSI 字符集和OEM字符集之间相互
转换。这在编辑框中包含文件名时是很有用的
CBS_OWNERDRAWFIXED
指定自绘式组合框,即由父窗口负责绘制列表框的内容,并且列表
项有相同的高度
CBS_OWNERDRAWVARIABLE 指定自绘式组合框,并且列表项有不同的高度
CBS_SIIMPLE 指定一个简易式组合框
CBS_SORT 自动对列表框组件中的项进行排序
CBS_DISABLENOSCROLL 使列表框在不需要滚动时显示一个禁止的垂直滚动条
CBS_NOINTEGRALHEIGHT
组合框的尺寸由应用程序而不是Windows 指定,通常,由Windows
指定尺寸会使列表项的某些部分隐藏起来
CBS_SIMPLE、CBS_DROPDOWN 和CBS_DROPDOWNLIST 分别用来将组合框指定为
简易式、下拉式和下拉列表式。一般还要为组合框指定WS_CHILD、WS_VISIBLE、
WS_TABSTOP、WS_VSCROLL 和CBS_AUTOHSCROLL 风格。如果要求自动排序,还应指
定CBS_SORT 风格。
对于用对话框模板编辑器创建的组合框控件,可以在控件的属xìng对话框中指定上表中列
出的控件风格。例如,在属xìng对话框中选择Dropdown,相当于指定了CBS_DROPDOWN。
5.6.2 CcomboBox 类的主要成员函数
CComboBox 类的成员函数较多。其中常用的函数可分为两类,分别针对编辑框组件和
列表框组件。可以想象,这些函数与CEdit 类和CListBox 类的成员函数肯定有很多类似之处,
但它们也会有一些不同的特点。如果读者能从“组合框是由编辑框和列表框组成”这一概念
出发,就能够很快的掌握CComboBox 的主要成员函数。
事实上,绝大部分CComboBox 的成员函数都可以看成是CEdit 或CListBox 成员函数的
重现。函数的功能、函数名,甚至函数的参数都是类似的。为了方便学习,下面在介绍
CComboBox 类的成员函数时,采用了与对应的CEdit 或CListBox 成员函数相比较的做法。
在成员函数的列表中,分别列出了成员函数名、对应的CEdit 或CListBox 成员函数以及二者
之间的不同之处。
针对编辑框组件的主要成员函数如表5-14 所示。该表的前3 个函数实际上是CWnd 类的
松语文学免费小说阅读_www.16sy.com
int SelectString(int nStartAfter,LPCTSTR lpszItem);
该函数仅适用于单选择列表框,用来选择与指定字符串相匹配的列表项。该函数会滚动
列表框以使选择项可见。参数的意义及搜索的方法与函数FindString 类似。如果找到了匹配
的项,函数返回该项的索引,如果没有匹配的项,函数返回LB_ERR 并且当前的选择不被改
变。
15.GetSelCount()函数
该成员函数声明如下:
int GetSelCount() const;
该函数仅用于多重选择列表框,它返回选择项的数目,若出错函数返回LB_ERR。
16.SetSel()函数
该成员函数声明如下:
int SetSel(int nIndex,BOOL bSelect = TRUE);
该函数仅适用于多重选择列表框,它使指定的列表项选中或落选。参数nIndex 指定了列
表项的索引,若为-1,则相当于指定了所有的项。参数bSelect 为TRUE 时选中列表项,否则
使之落选。若出错则返回LB_ERR。
17.GetSelItems()函数
该成员函数声明如下:
int GetSelItems(int nMaxItems, LPINT rgIndex) const;
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·122·
该函数仅用于多重选择列表框,用来获得选中的项的数目及位置。参数nMaxItems 说明
了参数rgIndex 指向的数组的大小。参数rgIndex 指向一个缓冲区,该数组是一个整型数组,
用来存放选中的列表项的索引。函数返回放在缓冲区中的选择项的实际数目,若出错函数返
回LB_ERR。
18.SetItemRange()函数
该成员函数声明如下:
int SetItemRange(BOOL bSelect,int nFirstItem,int nLastItem);
该函数仅用于多重选择列表框,用来使指定范围内的列表项选中或落选。参数nFirstItem
和nLastItem 指定了列表项索引的范围。如果参数bSelect 为TRUE,那么就选择这些列表项,
否则就使它们落选。若出错函数返回LB_ERR。
技巧:实现列表框的提示条(可以显示完整的列表框的项目文本)
用一个CListBox 派生类实现宿主(owner-draw)列表框,这个列表框的项目宽度超过了列表框本身
的宽度,因此当鼠标指针指向大宽度的列表框项时,希望显示一个类似Toolbar 的提示窗口,在窗口
中显示完整的列表框项目文本。
附带光盘下的工程演示列表框提示条的实现,主要是创建了可重用窗口类CPopupText。
CPopupText 类会根据提示文本的长度自己决定弹出窗口的大小。它的字体默认值与状态行显示字体
相同(由SystemParcomtersInfo(SPI_GETNONCLIENTMETRICS)返回的 NONCLIENTMETRICS 结构
成员 lfStatusFont 定义),设置 SW_SHOWNA 是很重要的,因为你不想使提示窗口为活动窗口,而
只是显示它。另外,CPopupText 还提供一个专门的函数CPopupText::ShowDelayed,它的功能是在显
示提示窗口之前设置一个毫秒级延时,如果延时为零,则立刻显示提示窗口,你可以使用这个特点来
替代对ShowWindow 的调用。如果要隐藏提示窗口或取消ShowDelayed,调用CPopupText::Cancel。
实例5-2:实现列表框的提示条实例。源代码在光盘中“\05\实例5-2\ListTest”目录下。
5.6 组合框(Combo box)控件
5.6.1 组合框控件的使用
组合框是一种传统控件,把一个编辑框和一个单选择列表框结合在了一起。用户既可以
在编辑框中输入,也可以从列表框中选择一个列表项来完成输入。组合框分为简易式
(Simple)、下拉式(Dropdown)和下拉列表式(Drop List)3 种。简易式组合框包含一个编
辑框和一个总是显示的列表框。下拉式组合框同简易式组合框类似,二者的区别在于单击下
拉箭头后是否会弹出列表框。下拉列表式组合框也有一个下拉的列表框,但它的编辑框是只
读的,不能输入字符。
Windows 中比较常用的是下拉式和下拉列表式组合框,在集成开发环境(IDE)中就大
枫叶文学网www.fywxw.com
第5 章 常用控件
·123·
量使用了这两种组合框。二者都具有占地小的特点,这在界面日益复杂的今天是十分重要的。
下拉列表式组合框的功能与列表框类似。下拉式组合框的典型应用是作为记事列表框使用,
既把用户在编辑框中敲入的东西存储到列表框组件中,这样当要重复同样的输入时,可以从
列表框组件中选取而不必在编辑框组件中重新输入。在集成开发环境(IDE)中的Find 对话
框中就可以找到一个典型的下拉式组合框。
应用一个列表框控件时,主要应遵循下列原则。
? 在创建组合框时指定CBS_DROPDOWNLIST 风格。
? 要限制列表项的数目,以防止内存不够。
? 如果在编辑框中输入的字符串不能与列表框组件中的列表项匹配,那么应该把该字符
串chā入到列表框中的0 位置处。最老的项处于列表的末尾。如果列表项的数目超出了
限制,则应把最老的项删除。
? 如果在编辑框中输入的字符串可以与列表框组件中的某一项完全匹配,则应该先把该
项从列表的当前位置删除,然后在将其chā入列表的0 位置处。
组合框控件会向父窗口发送控件通知消息,主要的通知消息如表5-12 所示的。
表5-12 组合框控件的通知消息
消息 含义
CBN_CLOSEUP 组合框的列表框组件被关闭,简易式组合框不会发出该消息
CBN_DBLCLK 用户在某列表项上双击鼠标,只有简易式组合框才会发出该消息
CBN_DROPDOWN 组合框的列表框组件下拉,简易式组合框不会发出该消息
CBN_EDITCHANGE
编辑框的内容被用户改变了,与CBN_EDITUPDATE 不同,该消息是
在编辑框显示的正文被刷新后才发出的,下拉列表式组合框不会发出
该消息
CBN_EDITUPDATE
在编辑框准备显示改变了的正文时发送该消息,下拉列表式组合框不
会发出该消息
CBN_ERRSPACE 组合框无法申请足够的内存来容纳列表项
CBN_SELENDCANCEL
表明用户的选择应该取消,当用户在列表框中选择了一项,然后又在
组合框控件外单击鼠标时就会导致该消息的发送
CBN_SELENDOK
用户选择了一项,然后按了回车键或单击了下滚箭头,该消息表明用
户确认了自己所作的选择
CBN_KILLFOCUS 组合框失去了输入焦点
CBN_SELCHANGE 用户通过单击或移动箭头键改变了列表的选择
CBN_SETFOCUS 组合框获得了输入焦点
组合框控件封装在MFC 的CComboBox 类中。需要指出的是,虽然组合框是编辑框和列
表框的组合,但是CComboBox 类并不是CEdit 类和CListBox 类的派生类,而是CWnd 类的
派生类。
CComboBox 的成员函数Create 负责创建组合框,该函数的声明如下:
BOOL Create(DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID);
参数dwStyle 指定了组合框控件的风格,如表5-13 所示,dwStyle 可以是这些风格的组
合。rect 说明的是列表框组件下拉后组合框的位置和尺寸。pParentWnd 指向父窗口,该参数
不能为NULL。nID 则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE。
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·124·
表5-13 组合框的风格
风格 含义
CBS_AUTOHSCROLL 使编辑框组件具有水平滚动的风格
CBS_DROPDOWN 指定一个下拉式组合框
CBS_DROPDOWNLIST 指定一个下拉列表式组合框
CBS_HASSTRINGS 指定一个含有字符串的自绘式组合框
CBS_OEMCONVERT
使编辑框组件中的正文可以在ANSI 字符集和OEM字符集之间相互
转换。这在编辑框中包含文件名时是很有用的
CBS_OWNERDRAWFIXED
指定自绘式组合框,即由父窗口负责绘制列表框的内容,并且列表
项有相同的高度
CBS_OWNERDRAWVARIABLE 指定自绘式组合框,并且列表项有不同的高度
CBS_SIIMPLE 指定一个简易式组合框
CBS_SORT 自动对列表框组件中的项进行排序
CBS_DISABLENOSCROLL 使列表框在不需要滚动时显示一个禁止的垂直滚动条
CBS_NOINTEGRALHEIGHT
组合框的尺寸由应用程序而不是Windows 指定,通常,由Windows
指定尺寸会使列表项的某些部分隐藏起来
CBS_SIMPLE、CBS_DROPDOWN 和CBS_DROPDOWNLIST 分别用来将组合框指定为
简易式、下拉式和下拉列表式。一般还要为组合框指定WS_CHILD、WS_VISIBLE、
WS_TABSTOP、WS_VSCROLL 和CBS_AUTOHSCROLL 风格。如果要求自动排序,还应指
定CBS_SORT 风格。
对于用对话框模板编辑器创建的组合框控件,可以在控件的属xìng对话框中指定上表中列
出的控件风格。例如,在属xìng对话框中选择Dropdown,相当于指定了CBS_DROPDOWN。
5.6.2 CcomboBox 类的主要成员函数
CComboBox 类的成员函数较多。其中常用的函数可分为两类,分别针对编辑框组件和
列表框组件。可以想象,这些函数与CEdit 类和CListBox 类的成员函数肯定有很多类似之处,
但它们也会有一些不同的特点。如果读者能从“组合框是由编辑框和列表框组成”这一概念
出发,就能够很快的掌握CComboBox 的主要成员函数。
事实上,绝大部分CComboBox 的成员函数都可以看成是CEdit 或CListBox 成员函数的
重现。函数的功能、函数名,甚至函数的参数都是类似的。为了方便学习,下面在介绍
CComboBox 类的成员函数时,采用了与对应的CEdit 或CListBox 成员函数相比较的做法。
在成员函数的列表中,分别列出了成员函数名、对应的CEdit 或CListBox 成员函数以及二者
之间的不同之处。
针对编辑框组件的主要成员函数如表5-14 所示。该表的前3 个函数实际上是CWnd 类的
松语文学免费小说阅读_www.16sy.com