ウィキのコピーミラー

これは pascal.chat のウィキのミラーです。編集、履歴、ログインはそちらで行います。

Colors/ja

Deutsch · English · Español · Français · Suomi · Русский · 中文(中国) · 日本語

=概要=

TColor は LCL の標準色で Delphi の TColor と互換性があります。TColor で RGB値(8 ビット×3)もしくは clDefault のようなシステムカラーを指定できます。また、LCL では TFPColor(RGBA、16 ビット×4)を使っている fpImage も共に使われています。

TColor から RGB への変換と逆変換

ユニット Graphics は以下の関数を提供しています。

pascal
function Blue(rgb: TColor): BYTE; // システムカラーでは動作しません
function Green(rgb: TColor): BYTE; // システムカラーでは動作しません
function Red(rgb: TColor): BYTE; // システムカラーでは動作しません
function RGBToColor(R, G, B: Byte): TColor;
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte); // システムカラーでは動作しません
function FPColorToTColor(const FPColor: TFPColor): TColor;
function TColorToFPColor(const c: TColor): TFPColor; // システムカラーでは動作しません

以下に示すように、あらかじめ定義されているカラー定数がいくつかあります。

pascal
  // 標準色
  clBlack   = TColor($000000);
  clMaroon  = TColor($000080);
  clGreen   = TColor($008000);
  clOlive   = TColor($008080);
  clNavy    = TColor($800000);
  clPurple  = TColor($800080);
  clTeal    = TColor($808000);
  clGray    = TColor($808080);
  clSilver  = TColor($C0C0C0);
  clRed     = TColor($0000FF);
  clLime    = TColor($00FF00);
  clYellow  = TColor($00FFFF);
  clBlue    = TColor($FF0000);
  clFuchsia = TColor($FF00FF);
  clAqua    = TColor($FFFF00);
  clLtGray  = TColor($C0C0C0); // clSilver の別名
  clDkGray  = TColor($808080); // clGray の別名
  clWhite   = TColor($FFFFFF);

システムカラー

例:clInfoBk、clInfoText

システムカラーは特別な意味を持ったカラー定数です。システムカラーの実際の色は状況やテーマに依存します。これらは単純な色ではありません。
例えば clInfoBk は、

pascal
Form1.Canvas.Brush.Color:=clInfoBk;  // ヒントウィンドウのデフォルトの背景ブラシを使用
Form1.Canvas.FillRect(10,10,50,50);

Windows でのヒントウィンドウは通常は白の背景なので、上記のは白で描画されます。Linux/GTK2 の場合、通常は金属風テクスチャなので、それで描画されます。これに文字も書き込むのであれば clInfoText などマッチする色を使う必要があるでしょう。そうしないとユーザにとって読みづらくなってしまうかもしれません。実際の記述例は以下のようなります。

pascal
Form1.Canvas.Brush.Color:=clInfoBk;  // ヒントウィンドウのデフォルトの背景ブラシを使用
Form1.Canvas.FillRect(10,10,50,50);
Form1.Canvas.Font.Color:=clInfoText;  // ヒントウィンドウのデフォルトの文字色を使用
Form1.Canvas.TextOut(10,10,'Hint');

システムカラー clInfoBk は Pen.Color と Font.Color に使用することはできません。使用しても決められた定義はされてなく、結果はウィジェットセットやユーザテーマに左右されるでしょう。
clInfoText についても同様です。Font.Color にだけ使用でき、Brush.Color に使っても動作しないでしょう。なお現在では、Pen.Color としてならすべてのウィジェットセットで使うことができるようになっています。

テーマの変更

ユーザがテーマを切り替えるとシステムカラーが変更されます。clInfoBk は白から青に変わるかもしれませんし、あるいは単純色からテクスチャに変更かもしれません。ブラシハンドルが新しく割り当てられたときに、この変更が反映されます。単純に Brush.Color:=clInfoBk と指定することではブラシハンドルが割り当てられないことを忘れてはなりません。実際に使うときになってからブラシハンドルは割り当てられるのです。以下に例を示します。

pascal
Form1.Canvas.Brush.Color:=clInfoBk; // ここではブラシハンドルは作られていません
Form1.Canvas.FillRect(10,10,50,50); // ここで現在のアクティブテーマのヒントウィンドウ用のブラシハンドルが作成されます
...
// この間にテーマが変更されたとしても、ブラシハンドルはまだ古いままです
...
Form1.Canvas.FillRect(10,10,50,50); // これは古いテーマブラシで描画されます
Form1.Canvas.Brush.Color:=clInfoBk; // 古い値と同じ値を指定してもブラシハンドルは新しく作成されません
Form1.Canvas.FillRect(10,10,50,50); // これも古いテーマブラシで描画されます
Form1.Canvas.Brush.Color:=clRed;    // 新たな色を指定すると古いハンドルは無効になります
Form1.Canvas.Brush.Color:=clInfoBk; // 改めて色を指定し直します
Form1.Canvas.FillRect(10,10,50,50); // ブラシハンドルが新しく作られ、新しいテーマで描画されます

システムカラーの一覧

以下の表はシステムカラーとその意味をまとめたものです。定義されている範囲外のテーマの使用に関しては定められてなく、結果はウィジェットセットとテーマに左右されます。例えば、clDefault は使用しているデバイスコンテキストの一般背景ブラシということです。カスタムコントロールをボタン要素で塗りたいのであれば、ユニット Themes の描画関数を使用してください。

カラー定数

LCL 定義

Delphi 注記

ウィジェットセットのサポート状況

clNone

描画なし。コントロールの未定義色として使用されます。コントロールが透過するわけでありません。

-

全部

clDefault

ブラシとして使用した場合、対象の DC(デバイスコンテキスト)の一般背景ブラシを使用します。

| -

全部

clScrollBar

スクロールバー本体

-

全部

clBackground

?

-

全部

clActiveCaption

アクティブウィンドのタイトルバー

-

なし

clInactiveCaption

非アクティブウィンドのタイトルバー

-

なし

clMenu

標準メニューアイテムの背景色

-

なし

clWindow

選択されていない文字の一般背景ブラシ。TEdit、TComboBox、TMemo、TListBox、TTreeView などのコントロール用に定義されています。

-

なし

clWindowFrame

ウィンドウの周り、フレームの色

-

なし

clMenuText

clMenu と共に使われるフォント色

-

なし

clWindowText

clWindow と共に使われるフォント色

-

なし

clCaptionText

アクティブウィンドのタイトルバーの文字色

-

なし

clActiveBorder

?

-

なし

clInactiveBorder

?

-

なし

clAppWorkspace

MDI メインフォームの背景色

-

なし

clHighlight

選択要素のブラシ色

-

なし

clHighlightText

選択文字のフォント色(clHighligh と共に使用)

-

なし

clBtnFace

ボタンの背景色

-

なし

clBtnShadow

アクティブの 3D エフェクトに使われているボタンの影の色(下と右側)

-

なし

clGrayText

無効要素のフォント色

-

なし

clBtnText

clBtnFace と共に使われるボタンのフォント色

-

なし

clInactiveCaptionText

非アクティブウィンドのタイトルバーの文字色

-

なし

clBtnHighlight

アクティブの 3D エフェクトに使われているボタンのハイライトの色(上と左側)

-

なし

cl3DDkShadow

?

-

なし

cl3DLight

?

-

なし

clInfoText

ヒント用のフォント色。clInfoBk と共に使用。

-

全部

clInfoBk

ヒント用のブラシ色。clInfoText と共に使用。

-

全部

clHotLight

?

-

なし

clGradientActiveCaption

アクティブウィンドウのタイトルバーのグラデーション作成時に使われるもう片方の色

-

なし

clGradientInactiveCaption

非アクティブウィンドウのタイトルバーのグラデーション作成時に使われるもう片方の色

-

なし

clMenuHighlight

選択されているメニューアイテムの背景色

-

なし

clMenuBar

メニューバーの背景色

-

なし

clForm

?

-

なし

clColorDesktop

?

-

なし

cl3DFace

?

-

なし

cl3DShadow

?

-

なし

cl3DHiLight

?

-

なし

clBtnHiLight

clBtnHighlight と同じ

-

なし

カスタムコントロールにテーマ要素を描画する

ユニット Themes は標準コントロールの画一された要素の描画のための関数を提供しています。例えば、TTreeView などの展開(+/-など)ボタンを描画するには、以下のようなコードを使用します。

pascal
uses Themes;

...

procedure TYourCustomControl.Paint;
const
  PlusMinusDetail: array[Boolean {強調表示}, Boolean {展開しているか}] of TThemedTreeview =
  (
    (ttGlyphClosed, ttGlyphOpened),
    (ttHotGlyphClosed, ttHotGlyphOpened)
  );
var
  Details: TThemedElementDetails;
  R: TRect;
  Collapse: boolean;
begin
  ...
  //テーマに沿った展開ボタンを描画します。
  Details := ThemeServices.GetElementDetails(PlusMinusDetail[False, Collapse]);
  R := Rect(ALeft, ATop, ARight + 1, ABottom + 1);
  ThemeServices.DrawElement(Canvas.Handle, Details, R, nil);
  ...
end;

From the Free Pascal wiki, page "Colors/ja", as it stood on 2020-02-11 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

第2版、最終更新:WikiArchive 。