色の使い方(1)TColor って何?Tip&解説Delphi で色を指定する時に何気なく使っている TColor 型の正しい使い方を知っていますか? 例えばフォームの Color Property にはデフォルトで clBtnFace が入っています。これを clBlack とすればフォームの色は真っ黒になります。でもよく考えてみて ください。clBtnFace という色はボタンの色という意味です。何故ストレートに clGray 等のように色の名前ではないのでしょうか? もし不思議に思うなら以下の解説を読んでみてください。もやもやが晴れると思います。 まず,TColor 用に Graphics ユニットで定義されている色定数をあげておきましょう(Delphi 6 では下記の表に若干新しい色が加わっています)。
色定数を注意深く見てください。clNone とclDefault は特殊なので除くと $00BBGGRR となっているものと $800000NN となっているものの2つのグループに別れていることがわかります。実は TColor の色の表しかたには4種類あるのです。
さて既に混乱されている方もおられると思いますが,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 で解説します。 |