友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第45部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
况。从左边列表框中选定若干项,单击 “添加到”,将所选定的项添
加到右边列表框 (注意列表框中可以包括相同字符串的项)。再从右边
列表框中选定若干项,验证按钮 “删除”和 “全部清除”是否正常工
作。
第七节 组合框
组合框 (bo box)可以看作是一个编辑框或静态文本框与一个列表
框的组合,组合框的名称也正是由此而来。当前选定的项将显示在组
合框的编辑框或静态文本框中。如果组合框具有下拉列表 (drop…down
list)样式,则用户可以在编辑框中键入列表框中某一项的首字母,
在列表框可见时,与该首字母相匹配的最近的项将被加亮显示。
组合框对应于Controls工具箱内的按钮为 。在绘制组合框的同时可
以使用控件的Properties对话框设置控件的各种属性样式。一些样式
已在前面的几节中作了介绍,因此这里不再重复,下面给出一些在前
面的内容中没有进行说明的样式及其含义:
Type: 指定组合框的类型。可以使用的类型如
下:
Simple:创建包括编辑框控件和列表
框的简单组合框,其中编辑框控件用
来接受用户的输入。
Dropdown:创建下拉组合框。该类型
…………………………………………………………Page 376……………………………………………………………
与简单组合框类似。但仅当用户单击
了编辑框控件部分右边的下拉箭头时
组合框的列表框部分才被显示。
Drop List:该类型类似于下拉样式
(drop…down),只是使用静态文本项代
替编辑框控件来显示列表框中的当前
选择。
默认值为Dropdown 。
Uppercase: 将选择域或列表中的所有文本转换为大
写。
类型:布尔值 默认值为假
Lowercase: 将选择域或列表中的所有文本转换为小
写。
类型:布尔值 默认值为假
与列表框不同的是,在绘制组合框的同时可以预先为组合框添加一些
可选项,方法是单击Properties对话框中的Data选项卡 (如图所示),
直接在Enter listbox items处键入组合框中的可选项,每一行为一
个选项,使用Ctrl+Enter键开始新的一行。在运行时这些选项将出现
在组合框的列表框中。
图6。 53 为组合框预置选项
MFC类CboBox封装了Windows标准组合框,其成员函数提供了对组
合框控件的常见操作的实现。表给出了对在类CListBox中定义的成员
函数的描述。
表6。 29 在类CListBox中定义的成员函数
成员函数 描述
…………………………………………………………Page 377……………………………………………………………
CboBox 构造一个CboBox对象
Create 创建一个组合框并将它与CboBox对象相
关联
InitStorage 为组合框的列表框部分的项和字符串预先分
配内存块
GetCount 获得组合框中列表框项的数 目
GetCurSel 如果存在的话,返回组合框中列表框的当前
选定项的索引
SetCurSel 选择组合框中列表框内的一条字符串
GetEditSel 获得组合框中编辑控件的当前选定的起始和
终止字符位置
SetEditSel 在组合框的编辑控件中选定字符
SetItemData 设置与组合框中指定项相关联的32位值
SetItemDataPtr 将与组合框中指定项相关联的32位值设置为
指定的void指针
GetItemData 获得由应用程序提供的与指定组合框项相关
联的32位值
GetItemDataPtr 以void指针的形式返回由应用程序提供的与
指定组合框项相关联的32位值
GetTopIndex 返回组合框中列表框部分的第一个可视项的
索引
SetTopIndex 在组合框中的列表框部分的顶部显示指定索
引对应的项
SetHorizontalExtent 以象素为单位指定组合框的列表框部分可以
横向滚动的宽度
GetHorizontalExtent 以象素为单位获得组合框中列表框部分可以
横向滚动的宽度
SetDroppedWidth 为组合框的下拉列表框部分设置最小允许宽
度
GetDroppedWidth 获得组合框的下拉列表框部分的最小允许宽
度
Clear 如果存在的话,删除编辑控件中当前选定的
内容
…………………………………………………………Page 378……………………………………………………………
Copy 如果存在的话,将当前选定以CF_TEXT格式
复制到剪贴板
Cut 如果存在的话,删除编辑控件中当前选定的
内容,并将其以CF_TEXT格式复制到剪贴板
Paste 当剪贴板包括CF_TEXT格式的数据时,从剪
贴板复制数据到编辑控件的当前插入位置
LimitText 设置用户可以在组合框的编辑控件中输入的
文本的长度限制
SetItemHeight 设置组合框中列表项的高度或编辑控件 (或
静态文本控件)部分的高度
GetItemHeight 获得组合框中列表项的高度
GetLBText 从组合框中的列表框获取字符串
续表6。29
成员函数 描述
GetLBTextLen 获得组合框的列表框中某一字符串的长度
ShowDropDown 对于具有CBS_DROPDOWN或
CBS_DROPDOWNLIST属性的组合框,显示或
隐藏其列表框
GetDroppedControlRect 获得下拉组合框的可视 (下拉)列表框的屏
幕坐标
GetDroppedState 判断下拉组合框的列表框是否可见(处理
下拉状态)
SetExtendedUI 对于具有CBS_DROPDOWN或
CBS_DROPDOWNLIST样式的组合框,选择默
认用户界面或扩展用户界面
GetExtendedUI 判断组合框具有默认用户界面还是扩展用
户界面
GetLocale 获得组合框的区域标识符
SetLocale 设置组合框的区域标识符
AddString 向组合框的列表框添加一字符串,对于具
有CBS_SORT样式的组合框,新增加的字符
串将被排序并插入到合适的位置,否则将
被添加到列表框框的末尾
…………………………………………………………Page 379……………………………………………………………
DeleteString 从组合框的列表框中删除字符串
InsertString 向组合框的列表框中插入一字符串
ResetContent 清除组合框的列表框和编辑控件中的所有
内容
Dir 添加文件名列表到组合框的列表框中
FindString 在组合框的列表框中查找包括指定前缀的
第一个字符串
FindStringExact 在组合框的列表框中查找与指定字符串匹
配的字符串
SelectString 在组合框的列表框中查找字符串,如果找
到的话,在列表框中选择该字符串,并将
字符串复制到编辑控件中
DrawItem 当一个自绘制组合框的可视部分改变时由
框架调用
MeasureItem 在创建自绘制组合框时,由框架调用以判
断组合框的尺寸
pareItem 当将一新项插入到排序的自绘制框中时由
框架调用以判断项的相对位置
DeleteItem 当一列表项被从自绘制组合框中删除时由
框架调用
下面的示例程序演示了自绘制组合框的使用。
1。 使用AppWizard创建名为boDemo的基于对话框的工程,按图
6。54添加工程的主对话框 (IDD_BODEMO_DIALOG)中的各个控件。每
个控件的属性如表6。30所示。
2。 在ClassView中用鼠标右击boDemo classes,选择New Class命
令。上面的操作将弹出如图6。55所示的对话框,确认在Class type下
拉列表框'注' 中选择了MFC Class。然后在Name处输入新的类名
CClrboBox,在Base class下拉列表框中选择CboBox。如果需
要修改新类的头文件或实现文件的文件名,可以单击Change按钮,这
里,我们接受默认的文件名ClrboBox。cpp和ClrboBox。h。
…………………………………………………………Page 380……………………………………………………………
图6。 54 工程boDemo的主对话框
表6。 30 对话框IDD_BODEMO_DIALOG的控件属性设置
控件类 ID 属性值
型
组合框 IDC_CLRBO Type:Dropdown
Owner draw:
Fixed
Sort:真
Vertical
scroll:真
Has string:假
下压按 IDC_ADDCLR Caption:添加颜
钮 色(&A)
IDC_CHGCLR Caption:改变颜
色(&C)
静态控 IDC_STATICCLR Caption属性值为
件 空
3。 使用ClassWizard的Message Map选项卡在类CClrboBox中重载
基类的MeasureItem成员函数,其重载版本的代码如下:
void CClrboBox::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
// 由于组合框具有 CBS_OWNERDRAWFIXED 样式,因此以 0 为参数调用成员函数
// GetItemHeight 获得每一项的固定高度
lpMeasureItemStruct…》itemHeight=GetItemHeight(0);
…………………………………………………………Page 381……………………………………………………………
}
图6。 55 从CboBox派生新类CClrboBox
函数MeasureItem在自绘制样式的组合框创建时由框架调用。该函数
将每一项的高度放入MEASUREITEMSTRUCT结构的成员中。如果对话框
以CBS_OWNERDRAWVARIABLE样式创建,框架将为列表框中的每一项调
用一次该成员函数,否则,该成员函数只被调用一次。
接着,在CClrboBox的重载基类的DrawItem成员函数,其代码如
下:
void CClrboBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC* pDC=CDC::FromHandle(lpDrawItemStruct…》hDC);
COLORREF cr=(COLORREF)lpDrawItemStruct…》itemData;
// 注意到在出错的情况下,GetCurSel 和 GetItemData 返回 CB_ERR,而常量
// CB_ERR 被定义为 …1,这时不应把它视为一种系统颜色。
if (cr==CB_ERR)
cr=GetSysColor(COLOR_WINDOW);
if (lpDrawItemStruct…》itemAction & ODA_DRAWENTIRE)
{
…………………………………………………………Page 382……………………………………………………………
// 需要重绘整个项
// 以该项所对应的颜色填充整个项
CBrush br(cr);
pDC…》FillRect(&lpDrawItemStruct…》rcItem; &br);
// 反色居中显示该颜色的 RGB 组成
CString str;
str。Format(〃R: %d G: %d B: %d〃; GetRValue(cr); GetGValue(cr); GetBValue(cr));
CSize size;
size=pDC…》GetTextExtent(str);
CRect rect=lpDrawItemStruct…》rcItem;
COLORREF tcr;
tcr=~cr & 0x00FFFFFF; // 获得背景色的反色,不能简单的使用 ~cr
pDC…》SetTextColor(tcr);
pDC…》SetBkColor(cr);
pDC…》TextOut(rect。left+(rect。Width()…size。cx)/2;
rect。top+(rect。Height()…size。cy)/2; str);
}
if ((lpDrawItemStruct…》itemState & ODS_SELECTED) &&
(lpDrawItemStruct…》itemAction & (ODA_SELECT | ODA_DRAWENTIRE)))
{
// 选中状态由未选中变为选中,其边框被加亮显示
COLORREF crHilite=~cr & 0x00FFFFFF;
CBrush br(crHilite);
pDC…》FrameRect(&lpDrawItemStruct…》rcItem; &br);
}
if (!(lpDrawItemStruct…》itemState & ODS_SELECTED
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!