📄 def_color_dlg.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>用Delphi实现自定义颜色对话框及其构件 </title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p align="center"> <font color="#0000c0"></p>
<h3 align="center">用Delphi 实 现 自 定 义 颜 色 对 话 框 及 其 构 件 </font></h3>
<h3 align="center">太 原 理 工 大 学 电 机 系 胡 晓 鹰<br>
武 汉 水 利 电 力 大 学 计 算 中 心 陈 谦 </h3>
<p><font color="#ffffff">----</font> 在 开 发 证 券 分 析 软 件 中, 经 常
要 绘 制 各 种 股 票 的 分 析 曲 线。 为 了 使 得 软<br>
件 的 功 能 更 加 方 便. 灵 活, 用 户 希 望 能 够 按 照 自 己 的
喜 好 自 定 义 各 种 曲 线 的<br>
颜 色。 在 W O R D97 的[ 格 式] 菜 单 下 的 字 体 对 话 框 中 有
类 似 的 功 能。 当 用 户<br>
单 击 字 体 对 话 框 中 的 颜 色 下 拉 框 时, 各 种 颜 色 的 简 单
图 案 和 字 体 的 颜 色 名<br>
称 一 起 显 示 出 来, 这 样 处 理 的 结 果 显 然 比 只 提 供 一 个
装 有 颜 色 名 称 的 下 拉<br>
框 效 果 要 好 的 多。 </p>
<p><font color="#ffffff">----</font> <b>一、 自 定 义 颜 色 对 话 框 的 实 现</b>
</p>
<p><font color="#ffffff">----</font> 在Delphi 中, 我 们 可 以 使 用TComboBox 实
现 类 似 的 功 能。 在TcomboBox 构 件 中 有 一<br>
个Style 属 性, 决 定TcomboBox 的 显 示 属 性。 通 常 可 选 取csDropDown,
csSimple, csDropDownList,<br>
csOwnerDrawFixed, csOwnerDrawVariable 等。 其 中 当 选 取csOwnerDrawFixed 时 表
示 创 建 一 个 自<br>
画 下 拉 框, 下 拉 框 的 每 一 项 的 高 度 由ItemHeight 属 性 决
定。 并 且 必 须 在TcomboBox<br>
的OnDrawItem 事 件 中 响 应 自 画 过 程。 OnDrawItem 的 定 义 为: </p>
<pre> property OnDrawItem: TDrawItemEvent;
TDrawItemEvent = procedure
(Control: TWinControl; Index: Integer Rect:
TRect; State: TOwnerDrawState) of object;
其 中 的 三 个 参 数 的 含 义 为:
Control: 包 含 下 拉 框 的TComboBox
Index: 自 画 的 下 拉 框 在
TComboBox 的Items 属 性 中 的 索 引 号
Rect: 自 画 的 位 置</pre>
<p><font color="#ffffff">----</font> 因 此, 知 道 了 需 要 自 画 的 矩 形
的 位 置(Rect 参 数) 和 在TComboBox 中 的 索 引 号<br>
(Index 参 数), 我 们 可 以 使 用TcomboBox 的Canvas 属 性 在 其 画 布
上 自 画。 </p>
<p><font color="#ffffff">----</font> 具 体 的 实 现 过 程 如 下: </p>
<p><font color="#ffffff">----</font> 1 . 新 建 一 个 工 程 文 件, 设 置 其
默 认 窗 体 的 有 关 属 性 为: </p>
<p><font color="#ffffff">----</font> Caption 自 定 义 下 拉 框 </p>
<p><font color="#ffffff">----</font> Name Form1 </p>
<p><font color="#ffffff">----</font> Position poScreenCenter </p>
<p><font color="#ffffff">----</font> 2 . 在 窗 体 中 放 置 两 个TcomboBox 构
件, 设 置 其 属 性 如 下: </p>
<p><font color="#ffffff">----</font> Name Style ItemHeight OnDrawItem </p>
<p><font color="#ffffff">----</font> ColorCombo1 csOwnerDrawFixed 20 ColorComboDrawItem </p>
<p><font color="#ffffff">----</font> ColorCombo2 csOwnerDrawFixed 30 ColorComboDrawItem </p>
<p><font color="#ffffff">----</font> 3 . 双 击ColorCombo1 和ColorCombo2 的Items 属
性 旁 的 圆 点 按 纽, 在"String List Editor" 对 话 框<br>
中 输 入 </p>
<p><font color="#ffffff">----</font> 黑 色 </p>
<p><font color="#ffffff">----</font> 蓝 色 </p>
<p><font color="#ffffff">----</font> 蓝 绿 </p>
<p><font color="#ffffff">----</font> 鲜 绿 </p>
<p><font color="#ffffff">----</font> 红 色 </p>
<p><font color="#ffffff">----</font> 黄 色 </p>
<p><font color="#ffffff">----</font> 等 各 种 颜 色 的 名 称 </p>
<p><font color="#ffffff">----</font> 4 . 在ColorCombo1 的OnDrawItem 事 件 中 加
入 如 下 代 码 </p>
<pre> procedure TForm1.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;</pre>
<p><font color="#ffffff">----</font> 5 . 保 存, 运 行 文 件, 我 们 可 以
看 到 和 W O R D 中 颜 色 下 拉 框 相 同 的 效 果 <br>
<font color="#ffffff">----</font> 有 兴 趣 的 读 者, 可 以 在 文 中 所 示
的 位 置 加 入 对 其 它 颜 色 处 理。 </p>
<p><font color="#ffffff">----</font> 以 上 程 序 在Delphi 3.0,4.0 上 通 过。 </p>
<p><font color="#ffffff">----</font> <b>二、 自 定 义 颜 色 对 话 框 构 件 的
编 写</b> </p>
<p><font color="#ffffff">----</font> 对 许 多Delphi 程 序 员 来 说, 如 何 编
写 自 己 的Delphi 构 件 还 是 比 较 陌 生 的, Delphi<br>
构 件 实 际 上 是 从Tcomponent 类 继 承 发 展 而 来, 编 写 构 件 实
际 就 是 编 写 特 殊 的<br>
类。 下 面 我 们 就 以 自 定 义 颜 色 对 话 框 为 例 介 绍 构 件 的
编 写。 </p>
<p><font color="#ffffff">----</font> 下 面TColorComboBox 是 从TcomboBox 类 继 承
来 的, 当 点 击 右 边 的 下 拉 箭 头 时 弹 出<br>
和 下 拉items 对 应 的 各 种 颜 色 自 画 框。 </p>
<p><font color="#ffffff">----</font> 1. 选 中Component 菜 单 项 中 的New Component
选 项。 在Ancestor Type 框 中 选TcomboBox, 在Class<br>
Name 框 中 填 入TColorComboBox, 在Palette Page 框 中 选Samples, 在Unit File Name
框 中 填 入<br>
ColorComboBox.pas, 然 后 点 击OK 按 钮。 </p>
<p><font color="#ffffff">----</font> 2. 选 中Component 菜 单 项 中 的Install
Component 选 项, 点 击Into new package, 在package name 框 中 写<br>
入 路 径 和ColorComboDpk.dpk, 点 击ok, 生 成ColorComboDpk.bpl 文 件。 </p>
<p><font color="#ffffff">----</font> 3. 使 用Tools 菜 单 中 的Image Editor 来 创
建 编 辑 文 件ColorComBox.dcr, 为TColorComboBox 类 建<br>
立 位 图。 </p>
<p><font color="#ffffff">----</font> 4. 在Create 中 加 入 对 字 体 大 小 高 度
的 规 定 及 对 控 件 的Style 属 性( 设 成<br>
csOwnerDrawFixed) 的 规 定, 在Create 后 执 行 的CreateWnd 中 初 始 化 颜
色 的items, 如 果 不 需 要<br>
那 么 多 颜 色 项, 可 以 以 后 在 生 成 控 件 的items 属 性 中 直
接 删 除 不 需 要 的 颜 色。 </p>
<p><font color="#ffffff">----</font> 5. 在DrawItem 事 件 中 加 入 颜 色 自 画
程 序, 此 事 件 在On DrawItem 之 前 发 生。 </p>
<p><font color="#ffffff">----</font> 实 现 程 序 如 下: </p>
<pre>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
(AOwner : TComponent); // 构 件 的 初 始 化
begin
inherited Create(AOwner);
Style := csOwnerDrawFixed; // 构 件 的 初 始 类 型
ItemHeight := 20;
Font.Size := 10;
end;
procedure TColorComboBox.CreateWnd;
// 颜 色 构 件 的Items 属 性 初 始 化
begin
inherited CreateWnd;
Items.Clear;
Items.Add(' 黑 色');
Items.Add(' 蓝 色');
Items.Add(' 蓝 绿');
Items.Add(' 鲜 绿');
Items.Add(' 粉 红');
Items.Add(' 红 色');
Items.Add(' 黄 色');
Items.Add(' 白 色');
Items.Add(' 深 蓝');
Items.Add(' 青 色');
Items.Add(' 绿 色');
Items.Add(' 紫 色');
Items.Add(' 深 红');
Items.Add(' 深 黄');
Items.Add(' 深 灰');
Items.Add(' 银 色');</pre>
<p><font color="#ffffff">----</font> // 若 不 需 要 这 么 多 颜 色 可 在 构
件 的items 属 性 中 删 除 不 需 要 的 颜 色 </p>
<p><font color="#ffffff">----</font> end; </p>
<p><font color="#ffffff">----</font> // 重 载DrawItem 过 程 </p>
<pre>procedure TColorComboBox.DrawItem
(Index: Integer; Rect: TRect;
State: TOwnerDrawState);
var
TempColor :TColor; // 自 画 颜 色
TempBrushColor :TColor; // 临 时 颜 色
begin // 本 构 件 的 默 认 自 画 设 置
TempBrushColor:=Canvas.Brush.Color;
// 保 存 原 来 的 的 颜 色
Canvas.FillRect(Rect);
if Items[index]=' 黑 色' then
TempColor := clBlack
else if Items[index]=' 蓝 色' then
TempColor := clBlue
else if Items[index]=' 蓝 绿' then
TempColor := clAqua
else if Items[index]=' 鲜 绿' then
TempColor := clLime
else if Items[index]=' 粉 红' then
TempColor := clFuchsia
else if Items[index]=' 红 色' then
TempColor := clRed
else if Items[index]=' 黄 色' then
TempColor := clYellow
else if Items[index]=' 白 色' then
TempColor := clWhite
else if Items[index]=' 深 蓝' then
TempColor := clNavy
else if Items[index]=' 青 色' then
TempColor := clTeal
else if Items[index]=' 绿 色' then
TempColor := clGreen
else if Items[index]=' 紫 色' then
TempColor := clPurple
else if Items[index]=' 深 红' then
TempColor := clMaroon
else if Items[index]=' 深 黄' then
TempColor := clOlive
else if Items[index]= ' 深 灰' then
TempColor := clGray
else if Items[index]=' 银 色' then
else TempColor := clSilver;
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.</pre>
<p><font color="#ffffff">----</font> 此 控 件 可 以 在 所 有 需 要 颜 色 选
项 的 程 序 中 使 用 而 且 非 常 方 便 和 美 观, 并<br>
且 使 编 程 节 省 很 多 时 间, 增 加 了 程 序 可 靠 性 和 可 读
性。 </p>
<p><font color="#ffffff">----</font> <b>三、 自 定 义 颜 色 对 话 框 构 件 的
使 用</b> </p>
<p><font color="#ffffff">----</font> 当 注 册 完 自 定 义 颜 色 构 件 后,
可 以 从Delphi 构 件 模 板 的Sample 页 中 选 择 自 定 义<br>
颜 色 构 件, 和 使 用Delphi 本 身 构 件 没 有 区 别。 </p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -