<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      用Delphi完成自定義顏色對話框及其構件

      [摘要]在 開 發 證 券 分 析 軟 件 中, 經 常 要 繪 制 各 種 股 票 的 分 析 曲 線。 為 了 使 得 軟 件 的 功 能 更 加 方 便. 靈 活, 用 戶 希 望 能 夠 按 照 自...
      在 開 發 證 券 分 析 軟 件 中, 經 常 要 繪 制 各 種 股 票 的 分 析 曲 線。 為 了 使 得 軟
      件 的 功 能 更 加 方 便. 靈 活, 用 戶 希 望 能 夠 按 照 自 己 的 喜 好 自 定 義 各 種 曲 線 的
      顏 色。 在 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,
      (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 . 保 存, 運 行 文 件, 我 們 可 以 看 到 和 W O R D 中 顏 色 下 拉 框 相 同 的 效 果
      ---- 有 興 趣 的 讀 者, 可 以 在 文 中 所 示 的 位 置 加 入 對 其 它 顏 色 處 理。

      ---- 以 上 程 序 在Delphi 3.0,4.0 上 通 過。

      ---- 二、 自 定 義 顏 色 對 話 框 構 件 的 編 寫

      ---- 對 許 多Delphi 程 序 員 來 說, 如 何 編 寫 自 己 的Delphi 構 件 還 是 比 較 陌 生 的, Delphi
      構 件 實 際 上 是 從Tcomponent 類 繼 承 發 展 而 來, 編 寫 構 件 實 際 就 是 編 寫 特 殊 的
      類。 下 面 我 們 就 以 自 定 義 顏 色 對 話 框 為 例 介 紹 構 件 的 編 寫。

      ---- 下 面TColorComboBox 是 從TcomboBox 類 繼 承 來 的, 當 點 擊 右 邊 的 下 拉 箭 頭 時 彈 出
      和 下 拉items 對 應 的 各 種 顏 色 自 畫 框。

      ---- 1. 選 中Component 菜 單 項 中 的New Component 選 項。 在Ancestor Type 框 中 選TcomboBox, 在Class
      Name 框 中 填 入TColorComboBox, 在Palette Page 框 中 選Samples, 在Unit File Name 框 中 填 入
      ColorComboBox.pas, 然 后 點 擊OK 按 鈕。

      ---- 2. 選 中Component 菜 單 項 中 的Install Component 選 項, 點 擊Into new package, 在package name 框 中 寫
      入 路 徑 和ColorComboDpk.dpk, 點 擊ok, 生 成ColorComboDpk.bpl 文 件。

      ---- 3. 使 用Tools 菜 單 中 的Image Editor 來 創 建 編 輯 文 件ColorComBox.dcr, 為TColorComboBox 類 建
      立 位 圖。

      ---- 4. 在Create 中 加 入 對 字 體 大 小 高 度 的 規 定 及 對 控 件 的Style 屬 性( 設 成
      csOwnerDrawFixed) 的 規 定, 在Create 后 執 行 的CreateWnd 中 初 始 化 顏 色 的items, 如 果 不 需 要
      那 么 多 顏 色 項, 可 以 以 后 在 生 成 控 件 的items 屬 性 中 直 接 刪 除 不 需 要 的 顏 色。

      ---- 5. 在DrawItem 事 件 中 加 入 顏 色 自 畫 程 序, 此 事 件 在On DrawItem 之 前 發 生。

      ---- 實 現 程 序 如 下:

      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(' 銀 色');
      ---- // 若 不 需 要 這 么 多 顏 色 可 在 構 件 的items 屬 性 中 刪 除 不 需 要 的 顏 色

      ---- end;

      ---- // 重 載DrawItem 過 程

      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.
      ---- 此 控 件 可 以 在 所 有 需 要 顏 色 選 項 的 程 序 中 使 用 而 且 非 常 方 便 和 美 觀, 并
      且 使 編 程 節 省 很 多 時 間, 增 加 了 程 序 可 靠 性 和 可 讀 性。

      ---- 三、 自 定 義 顏 色 對 話 框 構 件 的 使 用

      ---- 當 注 冊 完 自 定 義 顏 色 構 件 后, 可 以 從Delphi 構 件 模 板 的Sample 頁 中 選 擇 自 定 義
      顏 色 構 件, 和 使 用Delphi 本 身 構 件 沒 有 區 別。


      日韩精品一区二区三区高清