Colors/ja
│
Deutsch (de) │
English (en) │
español (es) │
suomi (fi) │
français (fr) │
日本語 (ja) │
русский (ru) │
中文(中国大陆) (zh_CN) │
概要
TColor は LCL の標準色で Delphi の TColor と互換性があります。TColor で RGB値(8 ビット×3)もしくは clDefault のようなシステムカラーを指定できます。また、LCL では TFPColor(RGBA、16 ビット×4)を使っている fpImage も共に使われています。
TColor から RGB への変換と逆変換
ユニット Graphics は以下の関数を提供しています。
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; // システムカラーでは動作しません
以下に示すように、あらかじめ定義されているカラー定数がいくつかあります。
// 標準色
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 は、
Form1.Canvas.Brush.Color:=clInfoBk; // ヒントウィンドウのデフォルトの背景ブラシを使用
Form1.Canvas.FillRect(10,10,50,50);
Windows でのヒントウィンドウは通常は白の背景なので、上記のは白で描画されます。Linux/GTK2 の場合、通常は金属風テクスチャなので、それで描画されます。これに文字も書き込むのであれば clInfoText などマッチする色を使う必要があるでしょう。そうしないとユーザにとって読みづらくなってしまうかもしれません。実際の記述例は以下のようなります。
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 と指定することではブラシハンドルが割り当てられないことを忘れてはなりません。実際に使うときになってからブラシハンドルは割り当てられるのです。以下に例を示します。
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 などの展開(+/-など)ボタンを描画するには、以下のようなコードを使用します。
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;