戻る ホーム 上へ 進む

色の使い方(1)TColor って何?

Tip&解説

Delphi で色を指定する時に何気なく使っている TColor 型の正しい使い方を知っていますか?

例えばフォームの Color Property にはデフォルトで clBtnFace が入っています。これを clBlack とすればフォームの色は真っ黒になります。でもよく考えてみて ください。clBtnFace という色はボタンの色という意味です。何故ストレートに clGray 等のように色の名前ではないのでしょうか? もし不思議に思うなら以下の解説を読んでみてください。もやもやが晴れると思います。

まず,TColor 用に Graphics ユニットで定義されている色定数をあげておきましょう(Delphi 6 では下記の表に若干新しい色が加わっています)。

色の名前色の値色の名前色の値色の名前色の値色の名前色の値
clScrollBar $80000000 clBackground $80000001 clActiveCaption $80000002 clInactiveCaption $80000003
clMenu $80000004 clWindow $80000005 clWindowFrame $80000006 clMenuText $80000007
clWindowText $80000008 clCaptionText $80000009 clActiveBorder $8000000A clInactiveBorder $8000000B
clAppWorkSpace $8000000C clHighlight $8000000D clHighlightText $8000000E clBtnFace $8000000F
clBtnShadow $80000010 clGrayText $80000011 clBtnText $80000012 clInactiveCaptionText $80000013
clBtnHighlight $80000014 cl3DDkShadow $80000015 cl3DLight $80000016 clInfoText $80000017
clInfoBk $80000018 clBlack $00000000 clMaroon $00000080 clGreen $00008000
clOlive $00008080 clNavy $00800000 clPurple $00800080 clTeal $00808000
clGray $00808080 clSilver $00C0C0C0 clRed $000000FF clLime $0000FF00
clYellow $0000FFFF clBlue $00FF0000 clFuchsia $00FF00FF clAqua $00FFFF00
clLtGray $00C0C0C0 clDkGray $00808080 clWhite $00FFFFFF clNone $1FFFFFFF
clDefault $20000000

色定数を注意深く見てください。clNone とclDefault は特殊なので除くと $00BBGGRR となっているものと $800000NN となっているものの2つのグループに別れていることがわかります。実は TColor の色の表しかたには4種類あるのです。

  1. RGB 型

    $00BBGGRR という形の色値です。 BB, GG, RR はそれぞれ「青」,「緑」,「赤」の明るさを表します。最も基本的な色の表しかたです。Canvas の Pixels Property を読んだ場合も常にこの形式になります。cl+色名(例: clRed)の定義済み色定数もこの形式になっています。

  2. PaletteRGB 型

    $02BBGGRR という形の色値です。 BB, GG, RR はそれぞれ「青」,「緑」,「赤」の明るさを表します。この色値はパレットをサポートしている画面モードでは,現在 Canvas に選択されているパレットの中で,最も指定された RGB 値の近い色を示すのに使われます。

  3. PaletteIndex 型

    $010000NN という形の色値です。 この色値は現在 Canvas に選択されているパレットの中で,NN 番目の色値示すのに使われます。

  4. System Color 型

    $800000NN という形の色値です。 この色値は システムカラーを表示要素(NN)で指定するのに使われます。表示要素というのは,例えば ボタンの色とかスクロールバーの色のことです。表示要素とそれの実際の色との対応は Windows 95 では「画面のプロパティ」の「デザイン」タブのダイアログで変更できます。NN は 「スクロールバーの色」は $00, 「ボタンの色」は $0F(15) ですが,定義済みの定数を使えば良いので覚える必要は有りません。cl+画面要素名(例: clBtnFace)の定義済み色定数は全てこの形式です。

さて既に混乱されている方もおられると思いますが,2 と 3 の説明がわからない方は取り敢えず忘れてください。実は,上に示した定義済みの色定数を使うのは特に難しくありません。Canvas の Pen.Color/Brush.Color/Font.Colorに指定して使っても,常にフォントや線やブラシは混じりけのない純色で希望通りの色で表示されます。Canvas の Pixels Property に代入しても希望の色が表示されます。何の心配もありません。

もしあなたの使っているシステムの画面モードHigh Color(16 bit Color)True Color(24 bit Color)ならビデオカードは何万色もの色が表示できますから当たり前のことですが,画面モード16色256色では同時に16色あるいは256色しか表示できません。それでも大丈夫なのです。何故かというと,16色,256色の画面モードでは予め予約色というものが確保されていて,それらは常に表示可能だからです。

今私が使っているマシンの「256色」での予約色を以下に示します。

予約色の図

cl+色名 の定義済み色定数の全てに対応する予約色があることに注意してください。256色モードでは予約色は全部で20色有ります。そのうち16色が 定義済み色定数に 対応しています。clSilver と clLtGray,clGray と clDkGray が同じ色なのも面白い所です。20色の全部に対応していないのは,もちろん画面モード16色では色が16色しか使えないので予約色が16色なのを考慮しているためです。

System Color 型(cl+表示要素) の色は,上の20色のいずれかに対応し,関係は「画面のプロパティ」で自由に変更できます。実は Visual Component Library の中では System Color 型 の色値は GetSysColor という API を使って RGB 型に変換してから使われます。これをやっているのが ColroToRGB という関数です。詳細は GetSysColor と ColorToRGB のヘルプを見てください。仕組みが判ると思います。ColroToRGB のソースを覗けば完璧でしょう。

さて,残りの PaletteRGB 型PaletteIndex 型ですが,これらは画面モード256色の時に予約色以外の色を使いたい時に使います。詳しくは次の Tips で解説します。

戻る ホーム 上へ 進む inserted by FC2 system