一、自定义颜色对话框的实现
在Delphi中,我们可以使用TComboBox实现类似的功能。在TcomboBox构件中有一个Style属性,决定TcomboBox的显示属性。通常可选取 csDropDown,csSimple,csDropDownList,csOwnerDrawFixed,csOwnerDrawVariable 等。其中当选取csOwnerDrawFixed时表示创建一个自画下拉框,下拉框的每一项的高度由ItemHeight属性决定。并且必须在TcomboBox的OnDrawItem 事件中响应自画过程。OnDrawItem的定义为:
property OnDrawItem: TDrawItemEvent;
TDrawItemEvent = procedure
(Control: TWinControl; Index: Integer Rect:
TRect; State: TOwnerDrawState) of object;
其中的三个参数的含义为:
Control: 包含下拉 框的TComboBox
Index:自画的下拉框 在
TComboBox的Items属性中的索引号
Rect:自画的位置
因此,知道了需要自画的矩形的位置(Rect参数)和在TComboBox中的索引号(Index参数),我们可以使用TcomboBox的Canvas属性在其画布上自 画。
具体的实现过程如下:
1.新建一个工程文件,设置其默认窗体的有关属性为:
Caption自定义下拉框
NameForm1
PositionpoScreenCenter
2.在窗体中放置两个TcomboBox构件,设置其属性如下:
Name Style ItemHeight OnDrawItem
ColorCombo1 csOwnerDrawFixed 20 ColorComboDrawItem
ColorCombo2 csOwnerDrawFixed 30 ColorComboDrawItem
3.双击ColorCombo1和ColorCombo2的Items属性旁的圆点按纽,在"String ListEditor"对话框中输入黑色、蓝色、蓝绿、鲜绿、红色、黄色等各种颜 色的名称
4.在ColorCombo1的OnDrawItem事件中加入如下代码
procedure T m1.ColorComboDrawItem
(Control: TWinControl; Index: Integer;
Rect: TRect; State: OwnerDrawState);
var
TempColor :TColor; // 自 画 颜 色
TempBrushColor :TColor; // 临 时 颜 色
begin
with (Control as TComboBox) do
// 在Combo 的Canvas 上 自 画
begin
TempBrushColor:=Canvas.Brush.Color;
//保存原来的的颜色
Canvas.FillRect(Rect);
case Index of //根据Index的不同,
定义不同自画的颜色
0: // 黑 色
TempColor:=clBlack;
1: // 蓝 色
TempColor:=clBlue;
2: // 蓝 绿
TempColor:=clAqua;
3: // 鲜 绿
TempColor:=clLime;
4: // 红 色
TempColor:=clRed;
5: // 黄 色
TempColor:=clyellow;
// 可以在此加入对其它颜色的响应
end;
Canvas.Brush.Color:=TempColor;
// 自画颜色矩形
Canvas.Rectangle(Rect.Left 4,
Rect.Top 1,
(Rect.Right Rect.Left) div 3,
Rect.Bottom-1);
Canvas.Brush.Color:=TempBrushColor;
// 显示与颜色对应的字符串
Canvas.TextOut((Rect.Left Rect.Right) div 2,
Rect.Top 1,
Items[Index]);
end;
end;
5.保存,运行文件,我们可以看到和WORD中颜色下拉框相同的效果有兴趣的读者,可以在文中所示的位置加入对其它颜色处理。
以上程序在Delphi3.0,4.0上通过。
二、自定义颜色对话框构件的编写
对许多Delphi程序员来说,如何编写自己的Delphi构件还是比较陌生的, Delphi构件实际上是从Tcomponent类继承发展而来,编写构件实际就是 编写特殊的类。下面我们就以自定义颜色对话框为例介绍构件的编写。
下面TColorComboBox是从TcomboBox类继承来的,当点击右边的下拉箭头时弹出和下拉items对应的各种颜色自画框。
1.选中Component菜单项中的NewComponent选项。在AncestorType框中选TcomboBox,在ClassName框中填入TColorComboBox,在PalettePage 框中选Samples,在UnitFileName框中填入ColorComboBox.pas,然后点击OK按钮。
2.选中Component菜单项中的InstallComponent选项,点击Intonew package,在packagename框中写入路径和ColorComboDpk.dpk,点击ok, 生成ColorComboDpk.bpl文件。
3.使用Tools菜单中的ImageEditor来创建编辑文件ColorComBox.dcr, 为TColorComboBox类建立位图。
4.在Create中加入对字体大小高度的规定及对控件的Style属性(设成 csOwnerDrawFixed)的规定,在Create后执行的CreateWnd中初始化颜色 的items,如果不需要那么多颜色项,可以以后在生成控件的items属性中直接删除不需要的颜色。
5.在DrawItem事件中加入颜色自画程序,此事件在OnDrawItem之前发 生。
实现程序如下:
unit ColorComboBox;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TColorComboBox = class(TComboBox)
private
{ Private declarations }
FOnDrawItem : TDrawItemEvent;
procedure DrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState);override;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner : TComponent);override;
procedure CreateWnd;override;
published
{ Published declarations }
property OnDrawItem : TDrawItemEvent
Read FOnDrawItem write FOnDrawItem;
end;
procedure Register;
implementation
procedure Register; // 注册构件
begin
RegisterComponents(Samples, [TColorComboBox]);
end;
constructor TColorComboBox.Create
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




