在 开 发 证 券 分 析 软 件 中, 经 常 要 绘 制 各 种 股 票 的 分 析 曲 线。 为 了 使 得 软
件 的 功 能 更 加 方 便. 灵 活, 用 户 希 望 能 够 按 照 自 己 的 喜 好 自 定 义 各 种 曲 线 的
颜 色。 在 W O R D97 的[ 格 式] 菜 单 下 的 字 体 对 话 框 中 有 类 似 的 功 能。 当 用 户
单 击 字 体 对 话 框 中 的 颜 色 下 拉 框 时, 各 种 颜 色 的 简 单 图 案 和 字 体 的 颜 色 名
称 一 起 显 示 出 来, 这 样 处 理 的 结 果 显 然 比 只 提 供 一 个 装 有 颜 色 名 称 的 下 拉
框 效 果 要 好 的 多。
---- 一、 自 定 义 颜 色 对 话 框 的 实 现
---- 在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 自 定 义 下 拉 框
---- Name Form1
---- Position poScreenCenter
---- 2 . 在 窗 体 中 放 置 两 个TcomboBox 构 件, 设 置 其 属 性 如 下:
---- Name Style ItemHeight OnDrawItem
---- ColorCombo1 csOwnerDrawFixed 20 ColorComboDrawItem
---- ColorCombo2 csOwnerDrawFixed 30 ColorComboDrawItem
---- 3 . 双 击ColorCombo1 和ColorCombo2 的Items 属 性 旁 的 圆 点 按 纽, 在"String List Editor" 对 话 框
中 输 入
---- 黑 色
---- 蓝 色
---- 蓝 绿
---- 鲜 绿
---- 红 色
---- 黄 色
---- 等 各 种 颜 色 的 名 称
---- 4 . 在ColorCombo1 的OnDrawItem 事 件 中 加 入 如 下 代 码
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,
(Rec