Share via


[色] ダイアログ ボックス

ユーザーが特定の色の値を選択できるようにするモーダル ダイアログ ボックスを表示します。 ユーザーは、基本カラー パレットまたはカスタム カラー パレットのセットから色を選択できます。 または、ユーザーは、ダイアログ ボックスのユーザー インターフェイスの RGB または色合い、彩度、明度 (HSL) の色値を変更することで、色の値を生成できます。 [ ] ダイアログ ボックスは、ユーザーが選択した色の RGB 値を返します。

CHOOSECOLOR 構造体を初期化し、その構造体を ChooseColor 関数に渡すことで、[] ダイアログ ボックスを作成して表示します。 CHOOSECOLOR 構造体に異なるパラメーター値を設定すると、[色] ダイアログ ボックスの表示方法に影響を与えることができます。 たとえば、ダイアログ ボックスの完全または部分的なユーザー インターフェイス バージョンを表示できます。 次の図は、[ ] ダイアログ ボックスの完全なユーザー インターフェイス バージョンを示しています。

[色] ダイアログ ボックス

ユーザーが [OK] ボタンをクリックすると、 ChooseColorTRUE を返します。 CHOOSECOLOR 構造体の rgbResult メンバーには、ユーザーが選択した色の RGB カラー値が含まれています。 RGB カラー値は、選択した色を構成する個々の赤、緑、青の色の強度を指定します。 個々の値の範囲は 0 から 255 です。 GetRValueGetGValue、および GetBValue マクロを使用して、RGB カラー値から個々の色を抽出します。

ユーザーが [色 ] ダイアログ ボックスをキャンセルするか、エラーが発生した場合、 ChooseColorFALSE を 返し、 rgbResult メンバーは定義されていません。 エラーの原因を特定するには、 CommDlgExtendedError 関数を呼び出して、拡張エラー値を取得します。

このセクションでは、次のテーマについて説明します。

[完全な色] ダイアログ ボックスと [部分的な色] ダイアログ ボックス

[色] ダイアログ ボックスには、ユーザー インターフェイスのフル バージョンと部分バージョンがあります。 フル バージョンには基本的なコントロールが含まれており、ユーザーがカスタム 色を作成できる追加のコントロールがあります。 部分バージョンには、ユーザーが色の値を選択できる基本カラー パレットとカスタム カラー パレットを表示するコントロールがあります。

[色] ダイアログ ボックスの部分的なバージョンには、[ ユーザー設定の色の定義 ] ボタンが含まれています。 ユーザーはこのボタンをクリックして、フル バージョンを表示できます。 CHOOSECOLOR 構造体の Flags メンバーで CC_FULLOPEN フラグを設定することで、[色] ダイアログ ボックスに常にフル バージョンを表示するように指示できます。 ユーザーがカスタムカラーを作成できないようにするには、 CC_PREVENTFULLOPEN フラグを設定して[ カスタムカラーの定義 ]ボタンを無効にすることができます。

基本色は、指定したデバイスで使用できる色の選択を表します。 表示される実際の色数は、ディスプレイ ドライバーによって決まります。 たとえば、VGA ドライバーは 48 色を表示し、モノクロ ディスプレイ ドライバーは 16 色のみを表示します。

ユーザー設定の色は、指定した色またはユーザーが作成する色です。 [色] ダイアログ ボックスを作成するときは、CHOOSECOLOR 構造体の lpCustColors メンバーを使用して、16 個のカスタム 色の初期値を指定する必要があります。 [色] ダイアログ ボックスの完全なバージョンが開いている場合、ユーザーは次のいずれかの方法でユーザー設定の色を作成できます。

  • カラー スペクトル コントロールと明るさスライド コントロールでカーソルを移動する
  • の編集コントロールに RGB 値を入力する
  • HueSatLum 編集コントロールに HSL 値を入力する

ユーザー設定の色の表示に新しいユーザー設定の色を追加するには、[ カスタム色に追加 ] ボタンをクリックします。 これにより、ダイアログ ボックスは、 lpCustColors メンバーが指す配列内の対応する要素に新しい色の RGB 値をコピーします。 ChooseColor の呼び出し間で新しいカスタム 色を保持するには、配列に静的メモリを割り当てる必要があります。 RGB および HSL カラー モデルの詳細については、「 カラー ダイアログ ボックスで使用されるカラー モデル」を参照してください。

[色] ダイアログ ボックスのカスタマイズ

[色] ダイアログ ボックスをカスタマイズするには、次のいずれかの方法を使用します。

  • ダイアログ ボックスを作成するときに CHOOSECOLOR 構造体の値を指定する
  • カスタム テンプレートを指定する
  • フック プロシージャを指定する

CHOOSECOLOR 構造体の Flags メンバーでフラグを設定することで、[色] ダイアログ ボックスの外観と動作を変更できます。 たとえば、 CC_SOLIDCOLOR フラグを設定して、ダイアログ ボックスに単色のみを表示するように指示できます。 ダイアログ ボックスで最初に黒以外の色を選択するには、 CC_RGBINIT フラグを設定し、 rgbResult メンバーに色を指定します。

たとえば、アプリケーションに固有の追加のコントロールを含める場合は、[色] ダイアログ ボックスにカスタム テンプレートを指定できます。 ChooseColor 関数は、既定のテンプレートの代わりにカスタム テンプレートを使用します。

[色] ダイアログ ボックスのカスタム テンプレートを指定するには

  1. Color.dlg ファイルで指定された既定のテンプレートを変更して、カスタム テンプレートを作成します。 既定の [色] ダイアログ テンプレートで使用されるコントロール識別子は、Color.dlg ファイルで定義されます。
  2. CHOOSECOLOR 構造体を使用して、次のようにテンプレートを有効にします。
    • カスタム テンプレートがアプリケーションまたはダイナミック リンク ライブラリのリソースである場合は、Flags メンバーで CC_ENABLETEMPLATE フラグを設定します。 構造体の hInstance メンバーと lpTemplateName メンバーを使用して、モジュールとリソース名を識別します。

      または

    • カスタム テンプレートが既にメモリ内にある場合は、 CC_ENABLETEMPLATEHANDLE フラグを設定します。 hInstance メンバーを使用して、テンプレートを含むメモリ オブジェクトを識別します。

[色] ダイアログ ボックスには CCHookProc フック プロシージャを指定できます。 フック プロシージャは、ダイアログ ボックスに送信されたメッセージを処理できます。 また、登録済みメッセージを使用して、ダイアログ ボックスの動作を制御することもできます。 カスタム テンプレートを使用して追加のコントロールを定義する場合は、コントロールの入力を処理するためのフック プロシージャを指定する必要があります。

[色] ダイアログ ボックスのフック プロシージャを有効にするには

  1. CHOOSECOLOR 構造体の Flags メンバーで、CC_ENABLEHOOK フラグを設定します。
  2. lpfnHook メンバーでフック・プロシージャーのアドレスを指定します。

WM_INITDIALOG メッセージを処理した後、ダイアログ ボックス プロシージャはWM_INITDIALOGメッセージをフック プロシージャに送信します。 このメッセージの lParam パラメーターは、ダイアログ ボックスの初期化に使用される CHOOSECOLOR 構造体へのポインターです。

ダイアログ ボックスは、ユーザーが [OK] ボタンをクリックすると、COLOROKSTRING 登録済みメッセージをフック プロシージャに送信します。 フック プロシージャは、選択した色を拒否し、このメッセージを受信したときに 0 を返すことによって、ダイアログ ボックスを強制的に開いたままにすることができます。 フック プロシージャを使用すると、 SETRGBSTRING 登録済みメッセージをダイアログ ボックスに送信することで、ダイアログ ボックスで特定の色を強制的に選択できます。 これらの登録済みメッセージを使用するには、メッセージ識別子を取得するために 、COLOROKSTRING 定数と SETRGBSTRING 定数を RegisterWindowMessage 関数に渡す必要があります。 その後、識別子を使用して、ダイアログ ボックスから送信されたメッセージを検出して処理したり、ダイアログ ボックスにメッセージを送信したりできます。

[色] ダイアログ ボックスで使用される色モデル

[色] ダイアログ ボックスのカスタム色拡張機能を使用すると、ユーザーは RGB 値または HSL 値を使用して色を指定できます。 ただし、 CHOOSECOLOR 構造体は RGB 値のみを使用して、ユーザーが作成または選択した色を報告します。

RGB カラー モデル

RGB モデルは、ディスプレイや光を放射するその他のデバイスの色を指定するために使用されます。 有効な赤、緑、青の値の範囲は 0 から 255 で、0 は最小強度を示し、255 は最大強度を示します。 次の図は、赤、緑、青の原色を組み合わせて 4 つの追加色を生成する方法を示しています。 (ディスプレイ デバイスの場合、赤、緑、青の値が 0 に設定されていると、黒の色が表示されます。ディスプレイ技術では、黒はすべての色の欠如です。

赤、緑、青の円が重なっている

次の表に、RGB モデルの 8 色とそれに関連付けられている RGB 値を示します。

Color RGB 値
[赤] 255, 0, 0
[緑] 0, 255, 0
0, 0, 255
シアン 0, 255, 255
赤紫 255, 0, 255
255, 255, 0
White 255, 255, 255
Black 0, 0, 0

 

システムは、内部色を 32 ビットの RGB 値として格納します。16 進数形式は 0x00bbggrr です。

下位バイトには、赤色の相対強度の値が含まれています。2 番目のバイトには緑の値が含まれています。3 番目のバイトには青の値が含まれています。 上位バイトは 0 である必要があります。

RGB マクロを使用すると、赤、緑、青の各コンポーネントの指定した強度に基づいて RGB 値を取得できます。 GetRValueGetBValueおよび GetGValue マクロを使用して、RGB カラー値から個々の色を抽出します。

HSL カラー モデル

[色] ダイアログ ボックスには、HSL 値を指定するためのコントロールが用意されています。 次の図は、[色] ダイアログ ボックスに表示されるカラー スペクトル コントロールと明るさスライド コントロールを示しています。 この図は、ユーザーがこれらのコントロールで指定できる値の範囲も示しています。

カラースペクトルと輝度スケール

[色] ダイアログ ボックスでは、彩度と明るさの値は 0 ~ 240 の範囲で、色相の値は 0 ~ 239 の範囲である必要があります。

HSL 値を RGB 値に変換する

[色] ダイアログ ボックスのComdlg32.dllに示されているダイアログ ボックス プロシージャには、HSL 値を対応する RGB 値に変換するコードが含まれています。 次の表に、RGB モデルの 8 色と、関連する HSL 値と RGB 値を示します。

Color HSL 値 RGB 値
[赤] (0, 240, 120) (255, 0, 0)
(40, 240, 120) (255, 255, 0)
[緑] (80, 240, 120) (0, 255, 0)
シアン (120, 240, 120) (0, 255, 255)
(160, 240, 120) (0, 0, 255)
赤紫 (200, 240, 120) (255, 0, 255)
White (0, 0, 240) (255, 255, 255)
Black (0, 0, 0) (0, 0, 0)