次の方法で共有


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

ユーザーが特定の色の値を選択できるようにするモーダル ダイアログ ボックスを表示します。 ユーザーは、一連の基本カラー パレットまたはカスタム カラー パレットから色を選択できます。 または、ユーザーは、ダイアログ ボックスのユーザー インターフェイスの 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 フラグを設定します。 hInstancelpTemplateName 構造体のメンバーを使用して、モジュールとリソース名を識別します。

      -または-

    • カスタム テンプレートが既にメモリ内にある場合は、 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 値を示します。

RGB 値
赤い 255, 0, 0
0, 255, 0
青い 0, 0, 255
シアン 0, 255, 255
マジェンタ 255, 0, 255
黄色 255, 255, 0
白い 255, 255, 255
黒い 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 値を示します。

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)
白い (0, 0, 240) (255, 255, 255)
黒い (0, 0, 0) (0, 0, 0)