按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
度
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) &&
…………………………………………………………Page 383……………………………………………………………
(lpDrawItemStruct…》itemAction & ODA_SELECT))
{
// 选中状态由选中变为非选中,清除其边框的加亮显示
CBrush br(cr);
pDC…》FrameRect(&lpDrawItemStruct…》rcItem; &br);
}
}
对于自绘制组合框来说,成员函数DrawItem是需要重载的一个很重要
的成员函数。该函数在自绘制组合框的可视部分发生改变时由框架调
用。在默认情况下,该成员函数不做任何操作。其参数
lpDrawItemStruct所指向的DRAWITEMSTRUCT结构包括了重绘制所需要
的各种信息,如所需重绘的项、其设备上下文以及所执行的重绘行为
等。在该成员函数终止前,应用程序应该恢复由该DRAWITEMSTRUCT结
构所提供的为该显示上下文所选定图形设备接口。
由表6。30可知在本示例程序中所使用的自绘组合框中的可选项是有序
的,而它们都是一些颜色值,框架如何知道当一个新的颜色值被添加
到组合框的列表框中时,它应该处于哪个颜色值之前,哪个颜色值之
后呢?这时通过调用成员函数pareItem成员函数来实现的。如果
在创建�