Delphi制作图形化的ComboBox

从Delphi5开始,Delphi集成开发环境中的Object Inspector就使用了图形化的风格来显示某些属性。比如Cursors、Colors、Fonts和Image List等等属性就是这种类型。第一次看到这样的效果,的确令人感到神奇,各种字体的名称可以直接以这种字体的样式显示出来,在选择字体的时候真是很方便。这种效果是如何实现的呢,其实就是使用了组件的“自绘”(Ower-drawing)方法。在Delphi中想要实现这样的功能是很方便的,现在我们就开始一段神奇的“图形化组件”之旅吧,Let's Draw!

要建立一个自绘的ComboBox组件,我们先要把它的Style属性设为cs_OwnerDrawFixed或者cs_OwnerDrawVariable,如果在ComboBox组件中的所有元素都是相等高度的,例如字符或图标,那么就使用cs_OwnerDrawFixed;如果在ComboBox组件中的各个元素不是相等高度的,例如不同大小的位图,那么就使用 cs_OwnerDrawVariable属性。ComboBox组件会接收到WM_MEASUREITEM消息,从而触发OnMeasureItem事件。Windows就不再对该组件进行绘制了,取而代之的是我们用发送WM_DRAWITEM的方式对它进行重绘。

下面我们用两个实例来说明完整的绘制过程:

1、显示颜色的Combobox:


(图一)

第一步,我们把颜色的名字加入ComboBox的Item属性中(这一步是在Form.OnCreate事件中完成的),所有的颜色的名称将被加入一个常量(Colors)中,代码如下:

const Colors:array[0..17] of TColor=
(clAqua, clBlack, ..., clWhite, clYellow) ;//一部分颜色的名称被省略了

第二步,绘制各元素,它的代码并不复杂,我们可以把颜色名称与各元素关联起来,用这种颜色在Combobox中绘制矩形并着色,代码如下:

procedure TForm1.ColorComboDrawItem (Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
 with Control as TComboBox do
 begin //填充矩形
   Canvas.Brush.Color := TColor(Colors[Index]);
   Canvas.FillRect(Rect);
   Canvas.TextOut(Rect.Left,Rect.Top,ColorToString(Colors[Index]))
 end;
end;

2、所见即所得的字体Combobox:


(图二)

虽然这个看起来很复杂,甚至有人可能会认为要用一张张字体的图片才能实现,实际上并非如此。大家一定还记得在Delphi中有一个TScreen类,这次就要用到它了。

第一步,系统字体并不像颜色名称那样少,如果还是用上面对付颜色的方法来对付字体,也许得干上整整一天,特别是那些美术字体的爱好者们,我们用下面的程序来填充:

for i := 0 to Screen.Fonts.Count-1 do
FontCombo.Items.Add(Screen.Fonts.Strings[i]);

第二步,绘制字体:

procedure TForm1.FontComboDrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
 with (Control as TComboBox).Canvas do
 begin
  Font.Name := Screen.Fonts.Strings[Index];
  FillRect(Rect);
  TextOut(Rect.Left,Rect.Top,PChar(Screen.Fonts.Strings[Index]))
 end;
end;

上面的“自绘”方法并不仅仅可以用在ComboBox上,也可用在其它的Windows公共组件上,比如ListView、TreeView、TabControl、StatusBar等等,只要你发挥想像力,在编程的领域没有什么是绝对的禁区,再加上Delphi这柄倚天剑,真的会有这样的感叹,“没有它做不到,只有你想不到”!

时间: 2024-12-22 10:32:19

Delphi制作图形化的ComboBox的相关文章

Kibana——数据图形化制作

Kibana把数据图形化,可以帮助我们更好的去分析数据,找到数据里面的结构 注意看一下,上面缩看的界面,是一个聚合的结果,他是由CPU Usage图表.System Load图表.CPU usage over time图表. System Load over time图表一起构造而成的.我把这种聚合称作一组相关性的数据看板,你可以随意的组合你的看板,如果你觉得这样做是合适的.那么,CPU Usage图表.System Load图表.CPU usage over time图表. System Lo

字体图形化设计:字体图形化设计的方法与技巧

网页制作Webjx文章简介:字体图形化设计在具体设计过程中应注意的点. PART1:为什么要字体图形化设计 现代设计中直接从电脑里调出来的千遍一律的标准字体已经不能满足互联网用户日渐提高的审美需求,所以设计师要打破常规,能根据不同的需求,对字体进行独特的个性化的设计.同时字体的图形化设计有利于页面f氛围的营造以及更好的传递产品的特性以及功能等,特别是在推广页面设计的时候我们对标题文案(往往概括了整个活动的专题商业需求)进行特殊的设计处理,与其他的内容文案形成对比,引起用户的知觉兴趣,从而达到让用

设计感悟:字体图形化设计的方法与技巧

网页制作Webjx文章简介:字体图形化在设计中的应用. PART1:为什么要字体图形化设计 现代设计中直接从电脑里调出来的千遍一律的标准字体已经不能满足互联网用户日渐提高的审美需求,所以设计师要打破常规,能根据不同的需求,对字体进行独特的个性化的设计.同时字体的图形化设计有利于页面f氛围的营造以及更好的传递产品的特性以及功能等,特别是在推广页面设计的时候我们对标题文案(往往概括了整个活动的专题商业需求)进行特殊的设计处理,与其他的内容文案形成对比,引起用户的知觉兴趣,从而达到让用户有效的了解页面

用Flash图形化数据(一)_php基础

by Bryan Mattern  一木 译 SWF和Flash简介     SWF是Macromedia Flash用来在Internet上向用户传送图片.动画和声音的文件格式.Flash是你能够向用户提供一个丰富的和动态的界面.大约90%的Web用户不用安装浏览器插件就可以浏览SWF内容,超过2亿人下载了Flash播放器.Macromedia在1998年4月公开了SWF规范.在PHP4中加入SWF的支持.     PHP内建的动态生成图片的能力是一个吸引我的特征.它可以生成看起来更专业更让人

用Flash图形化数据

SWF和Flash简介 SWF是Macromedia Flash用来在Internet上向用户传送图片.动画和声音的文件格式.Flash是你能够向用户提供一个丰富的和动态的界面.大约90%的Web用户不用安装浏览器插件就可以浏览SWF内容,超过2亿人下载了Flash播放器.Macromedia在1998年4月公开了SWF规范.在PHP4中加入SWF的支持. PHP内建的动态生成图片的能力是一个吸引我的特征.它可以生成看起来更专业更让人舒适的报表和界面.一开始,我用充斥在网上的各种GD代码来创建图

图形化编程实现改进的欧拉格式和龙格库塔格式。这里有个C语言的,想改写成C#。

问题描述 图形化编程实现改进的欧拉格式和龙格库塔格式.这里有个C语言的,想改写成C#. 1)改进欧拉法求解常微分方程的初值问题 #include float func(float x,float y) { return(y-x); } float euler(float x0,float xn,float y0,int N) { float x,y,yp,yc,h; int i; x=x0; y=y0; h=(xn-x0)/(float)N; for(i=1;i<=N;i++) { yp=y+h

图形化管理MYSQL数据库的工具 SQLyog 8.6.2 发布

SQLyog 是一个易于使用的.快速而简洁的图形化管理MYSQL数据库的工具,它能够在任何地点有效地管理你的数据库. Changes: 1. SJA now supports an additional -r parameter that tells how big CHUNKS should be when copying to an empty table. 2. The -r parameter only has effect with Data Sync jobs and is igno

CSS3 HTML5图形化边界实例

顾名思义,图形化边界就是允许使用图片作为对象的边界,语法如下: border: 5px solid #cccccc; -webkit-border-image: url(/images/border-image.png) 5 repeat; -moz-border-image: url(/images/border-image.png) 5 repeat; border-image: url(/images/border-image.png) 5 repeat; 这里,border: 5px 设

网页设计技巧:视差滚动效果和图形化在网页中的呈现

文章描述:ONE 视差滚动效果 Parallax Scrolling. ONE 视差滚动效果 Parallax Scrolling 大家小时候是否玩过红白机或小霸王上面的游戏? 这些游戏基本上都是通过前景与背景在场景移动时产生不同的视差,从而达到简单的立体效果 所以说视差滚动不是啥新鲜事儿,我们小时候就玩过了-- 目前这种视差滚动效果被越来越多的国外网站所应用, 成为网页设计的热点趋势 给它以重新定义 不过这类效果的使用也需要看具体环境和最终页面出来的整体性能,防止页面过于拖沓. 其次,设计上要