手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

如何用TComboBox模拟TColorBox

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

今天在CSDN见到一位网友问及如何用TComboBox模拟TColorBox,一时兴起,写了一些代码。略加注释后发表到文档区,以备将来查询。
TColorBox是VCL中提供的选取颜色的组件,同TComboBox相同,两个组件都继承自TCustomComboBox,有很多相同的属性和方法,如Style, ItemHeight,Canvas(这个属性是继承自TCustomCombo组件(TCustomCombo的父类)),TColorBox列出了系统中定义的颜色字符串,每一项前面有个小方块,填充了该项目所代表的颜色,后面是颜色字符串,这种效果ComboBox中很容易实现。实现方法,就是ccrun(老妖)所喜欢的自画。通过ComboBox的OnDrawItem方法实现画方块和绘制字符串。可是如何取得系统中定义的颜色字符串列表呢?答案就是通过GetColorValues函数(类似的更有GetCharsetValues)。这个函数能够了取得系统中定义过的颜色字符串列表,原型如下:
extern PACKAGE void __fastcall GetColorValues(Classes::TGetStrProc &Proc);

TGetStrProc的原型:
typedef void __fastcall (__closure *TGetStrProc)(const AnsiString S);

OK,下面开始写代码做测试。在Form上添加一个ComboBox,再添加一个ColorBox(作对比用)

因为我们的代码中需要动态的指定ComboBox的自画函数,所以在单元文档的.h中,TForm类中声明一下自画函数。当然,您能够通过在Design界面上选择ComboBox的OnDrawItem,然后双击,IDE会自动产生相应的声明和定义代码。

先来看看效果图:


自画函数的声明(.h文档):
publice: // User declarations
void __fastcall ComboBox1DrawItem(TWinControl *Control, int Index,
// 本文转自 C Builder 研究 - http://www.ccrun.com/article.asp?i=997&d=6rb201
TRect &Rect, TOwnerDrawState State);

自画函数的定义(.cpp文档):
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index,
TRect &Rect, TOwnerDrawState State)
{
TComboBox *cbb = (TComboBox *)Control;
String strText = cbb->Items->Strings[Index];
// 用白色填充当前项目所占的区域
cbb->Canvas->Brush->Color = clWhite;
cbb->Canvas->FillRect(Rect);
// 假如当前项目处于被选中状态
if(State.Contains(odSelected))
{
// 假如当前项拥有焦点,重画一次虚线框实现虚线框的擦除
if(State.Contains(odFocused))
::DrawFocusRect(cbb->Canvas->Handle, &Rect);
// 换一种颜色画边框,实现高亮效果
cbb->Canvas->Brush->Color = TColor(0x00FFB2B5);
cbb->Canvas->Rectangle(Rect.Left, Rect.Top,
Rect.Right, Rect.Bottom);
}
// by ccrun(老妖) 欢迎光临 C Builder研究 - http://www.ccrun.com
//
// 取得当前项字符串所代表的颜色

int nColor;
IdentToColor(strText, nColor);
cbb->Canvas->Brush->Color = TColor(nColor);
// 画边框和文字
cbb->Canvas->Rectangle(Rect.Left 2, Rect.Top 2, Rect.Left 18, Rect.Top 18);
cbb->Canvas->Font->Color = clBlack;
cbb->Canvas->Brush->Style = bsClear;
cbb->Canvas->TextOutA(Rect.Left 20, Rect.Top 4, strText);
}

以上是ComboBox组件自画项目的实现,我们还需要一些初始化工作,在TForm的构造函数中(当然也能够在Form的OnCreate事件中):
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ComboBox1->Items->Clear();
// 通过回调函数获取系统中定义的颜色名称
// 63 63 72 75 6E 2E 63 6F 6D
TGetStrProc AddValue = (TGetStrProc)&ComboBox1->Items->Add;
GetColorValues(TGetStrProc(AddValue));
// 改变ComboBox的风格使其能自画
ComboBox1->Style = csOwnerDrawFixed;
// ComboBox中每一项的高度
ComboBox1->ItemHeight = 20;
// 指定ComboBox的项目自画事件
ComboBox1->OnDrawItem = (TDrawItemEvent)&ComboBox1DrawItem;
// 使ComboBox选中第一个项目
ComboBox1->ItemIndex = 0;
}




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS