Delphi制作图形化的ComboBox

2016-01-29 14:24 74 1 收藏

Delphi制作图形化的ComboBox,Delphi制作图形化的ComboBox

【 tulaoshi.com - Delphi 】

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

来源:http://www.tulaoshi.com/n/20160129/1493200.html

延伸阅读
设计前的思考 文字是一种记录与传达语言的符号,是人类文明进步的重要标志。随着图形化时代的来临,文字与图形的关系在设计领域起着举足轻重的作用。当练习字体设计时,找有代表性的字体来做,练习有代表性的字体不但可以激发你的创意,还可以提高你的思维能力。文字经过艺术化设计后,可以让文字形象变得情景化、视觉化、强化语言效果,对提...
标签: excel
Excel2013如何运用rept函数将数字图形化   1、首先,我们打开一份表格,看到各个公司名称以及评分,我们要做的是在等级列中,将评分图形化,在C2单元格输入:=REPT("★",INT(B2))。 2、回车按下,得到结果是4颗星,看起来是没有错误,但是我们利用单元格填充开始往下拉动时,发现半颗星算不进来。 3、至此...
标签: ASP
  /* 豆腐制作,都是精品 http://www.asp888.net 豆腐技术站 如转载,请保留完整版权信息 */ 很久没有给大家带来新的文章了,最近豆腐忙于公司的业务,怠慢了各位朋友,在这里给大家先说一声 对不起了,没有办法,豆腐也要生活呀。 aspImage是serverobjects站点上非常好的一个组件,它可以使我们利用Asp实现很多对于图形的处理功能。 比...
标签: ASP
  /* 豆腐制作,都是精品 http://www.asp888.net 豆腐技术站 如转载,请保留完整版权信息 */ 前面我们讲了如何利用AspImage来制作柱图,柱图还好办,起码有关于长方形的函数,我们可以来 借用,但是如果是,饼图怎么办? 有的朋友不是说了,AspImage上不是有Pie的函数吗?是呀,它是有,但是它的那个也太难用了。 豆腐没有办法,经过同事...
标签: 服务器
Linux图形化界面下使用命令进行截图的方法   以前在LINUX里面截图都是直接按print screen键或者 alt + print screen。 但是print screen是整个屏幕, alt + print screen是当前窗口。 想要截屏幕中的一块区域用什么来? 答案是import命令, 输入: 代码如下: $ import ddd.jpg 然后鼠标就会变成"+&qu...

经验教程

552

收藏

41
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部