当前位置: 首页 > 图文教程 > 开发语言 > Delphi > Delphi制作图形化的ComboBox

Delphi
在线播放器DIY
关于VisiBroker For Delphi的使用(3)
关于VisiBroker For Delphi的使用(2)
关于VisiBroker For Delphi的使用(1)
Delphi的两个实用技巧(2)巧用Windows的API函数
Delphi的两个实用技巧(1)播放Flash
delphi学习:两种方法使用xml文档
Delphi与Word之间的融合技术
Delphi中动态链接库(DLL)的建立和使用
Delphi基础:Window 消息大全使用详解下
Delphi基础:Window 消息大全使用详解上
教你在DELPHI中如何调用系统对话框
Delphi开发单机瘦小数据库程序要点
用Delphi + DirectX开发简单RPG游戏
Delphi7从入门到精通之认识Delphi编辑器
Delphi7从入门到精通之历数Delphi七个版本
Delphi学习:图像放大漫游攻略
用编程来实现24小时制到12小时制的转换
一个实际的OLE服务器的开发
Delphi一点通:如何将源代码学好

Delphi制作图形化的ComboBox


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 151 ::
收藏到网摘: n/a

  要建立一个自绘的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这柄倚天剑,真的会有这样的感叹,“没有它做不到,只有你想不到”!