Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16496846
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:50:45

下载本文示例代码
  从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 doFontCombo.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这柄倚天剑,真的会有这样的感叹,“没有它做不到,只有你想不到”!zmbbs=1;   从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 doFontCombo.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这柄倚天剑,真的会有这样的感叹,“没有它做不到,只有你想不到”!zmbbs=1; 下载本文示例代码


Delphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBoxDelphi制作图形化的ComboBox
阅读(249) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~