手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

用Delphi实现自定义颜色对话框及其构件

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
  用户希望能够按照自己的喜好自定义各种曲线的颜色。在WORD97的[格式]菜单下的字体对话框中有类似的功能。当用户单击字体对话框中的颜色下拉框时,各种颜色的简单图案和字体的颜色名称一起显示出来,这样处理的结果显然比只提供一个装有颜色名称 的下拉框效果要好的多。

  一、自定义颜色对话框的实现

  在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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!