Colors/ja

From Free Pascal wiki
Jump to: navigation, search

Deutsch (de) English (en) español (es) français (fr) 日本語 (ja)

日本語版メニュー
メインページ - Lazarus Documentation日本語版 - 翻訳ノート - 日本語障害情報


概要

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(デバイスコンテキスト)の一般背景ブラシを使用します。
  • フォームのキャンバスで FillRect を使用した場合、標準ウィンドウの一般背景で矩形領域を塗りつぶします。これはウィジェットセットとテーマで定義されていて、通常は灰色、グラデーションもしくは画像が使われます。
  • TListBox のキャンバスで clDefault を使用した場合、一般背景で塗りつぶされます。Windows であれば通常は白です。つまり、TListBox では clDefault は clWindow と同じことです。
  • ペン色として使用した場合、デバイスコンテキストのデフォルトの線色が使われます。
  • フォント色として使用した場合、デバイスコンテキストの一般文字色が使われます。
- 全部
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;