共用方式為


色彩對話方塊

顯示可讓使用者選擇特定色彩值的強制回應對話方塊。 使用者可以從一組基本或自訂調色盤中選擇色彩。 或者,使用者可以修改對話方塊使用者介面的 RGB 或色調、飽和度、亮度 (HSL) 色彩值來產生色彩值。 [ 色彩 ] 對話方塊會傳回使用者所選取色彩的 RGB 值。

您可以藉由初始化CHOOSECOLOR結構,並將結構傳遞至ChooseColor函式,來建立並顯示[色彩] 對話方塊。 藉由設定 CHOOSECOLOR 結構的不同參數值,您可以影響 [色彩] 對話方塊的顯示方式。 例如,您可以顯示對話方塊的完整或部分使用者介面版本。 下圖顯示 [ 色彩 ] 對話方塊的完整使用者介面版本。

色彩對話方塊

如果使用者按一下 [ 確定 ] 按鈕, ChooseColor 會傳回 TRUE CHOOSECOLOR結構的rgbResult成員包含使用者所選取色彩的 RGB 色彩值。 RGB 色彩值會指定組成所選色彩之個別紅色、綠色和藍色的強度。 個別值的範圍從 0 到 255。 使用 GetRValueGetGValueGetBValue 宏,從 RGB 色彩值擷取個別色彩。

如果使用者取消 [ 色彩 ] 對話方塊或發生錯誤, ChooseColor 會傳回 FALSE ,而且未定義 rgbResult 成員。 若要判斷錯誤的原因,請呼叫 CommDlgExtendedError 函 式來擷取擴充的錯誤值。

本節涵蓋下列主題

完整和部分色彩對話方塊

[色彩] 對話方塊具有完整版本和部分版本的使用者介面。 完整版本包含基本控制項,並具有可讓使用者建立自訂色彩的其他控制項。 部分版本具有控制項,可顯示使用者可從中選取色彩值的基本和自訂調色盤。

[色彩] 對話方塊的部分版本包含 [ 定義自訂色彩 ] 按鈕。 使用者可以按一下此按鈕以顯示完整版本。 您可以在CHOOSECOLOR結構的Flags成員中設定CC_FULLOPEN旗標,以指示 [色彩] 對話方塊一律顯示完整版本。 若要防止使用者建立自訂色彩,您可以設定 CC_PREVENTFULLOPEN 旗標來停用 [ 定義自訂色彩 ] 按鈕。

基本色彩代表指定裝置上可用色彩的選取範圍。 顯示的實際色彩數目是由顯示驅動程式決定。 例如,VGA 驅動程式會顯示 48 種色彩,而單色顯示器驅動程式只會顯示 16。

自訂色彩是您指定的色彩,或是使用者建立的色彩。 當您建立 [色彩] 對話方塊時,必須使用CHOOSECOLOR結構的lpCustColors成員來指定 16 個自訂色彩的初始值。 如果 [色彩] 對話方塊的完整版本已開啟,使用者可以透過下列其中一種方法來建立自訂色彩:

  • 移動色彩頻譜控制項中的游標和亮度投影片控制項
  • 紅色綠色藍色 編輯控制項中輸入 RGB 值
  • HueSatLum 編輯控制項中輸入 HSL 值

若要將新的自訂色彩新增至自訂色彩顯示,使用者可以按一下 [ 新增至自訂色彩 ] 按鈕。 這也會導致對話方塊將新色彩的 RGB 值複製到 lpCustColors 成員所指向陣列中的對應元素。 若要在對 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 結構的指標。

當使用者按一下 [確定] 按鈕時,對話方塊會將COLOROKSTRING已註冊的訊息傳送至勾點程式。 攔截程式可以拒絕選取的色彩,並在收到此訊息時強制對話方塊保持開啟狀態。 攔截程式可以將 SETRGBSTRING 已註冊的訊息傳送至對話方塊,強制對話方塊選取特定色彩。 若要使用這些已註冊的訊息,您必須將 COLOROKSTRINGSETRGBSTRING 常數傳遞至 RegisterWindowMessage 函式,以取得訊息識別碼。 然後,您可以使用識別碼來偵測及處理從對話方塊傳送的訊息,或傳送訊息至對話方塊。

色彩對話方塊使用的色彩模型

[色彩] 對話方塊的自訂色彩延伸可讓使用者使用 RGB 或 HSL 值來指定色彩。 不過, CHOOSECOLOR 結構只會使用 RGB 值來報告使用者所建立或選取的色彩。

RGB 色彩模型

RGB 模型用來指定顯示器和其他發出光線的裝置色彩。 有效的紅色、綠色和藍色值範圍從 0 到 255,0 表示最小強度,255 表示最大濃度。 下圖顯示如何結合主要色彩紅色、綠色和藍色,以產生四個額外的色彩。 (針對顯示裝置,當紅色、綠色和藍色值設定為 0 時,色彩黑色會產生。在顯示技術中,黑色是沒有所有色彩。)

重迭的紅色、綠色和藍色圓圈

下表列出 RGB 模型的八種色彩及其相關聯的 RGB 值。

色彩 RGB 值
紅色 255, 0, 0
綠色 0, 255, 0
藍色 0, 0, 255
11:青色 0, 255, 255
桃紅色 255, 0, 255
黃色 255, 255, 0
白色 255, 255, 255
黑色 0, 0, 0

 

系統會將內部色彩儲存為具有下列十六進位格式的 32 位 RGB 值:0x00bbggrr。

低序位元組包含紅色相對濃度的值;第二個位元組包含綠色的值;和第三個位元組包含藍色的值。 高序位元組必須是零。

您可以使用 RGB 宏,根據紅色、綠色和藍色元件的指定濃度來取得 RGB 值。 使用 GetRValueGetBValueGetGValue 宏,從 RGB 色彩值擷取個別色彩。

HSL 色彩模型

[色彩] 對話方塊提供用來指定 HSL 值的控制項。 下圖顯示出現在 [色彩] 對話方塊中的色彩範圍控制項和亮度投影片控制項。 此圖也會顯示使用者可以使用這些控制項指定的值範圍。

色彩範圍和亮度刻度

在 [色彩] 對話方塊中,飽和度和亮度值必須位於範圍 0 到 240,而色調值必須位於範圍 0 到 239。

將 HSL 值轉換為 RGB 值

[色彩] 對話方塊Comdlg32.dll中提供的對話方塊套裝程式含將 HSL 值轉換成對應 RGB 值的程式碼。 下表列出 RGB 模型的八種色彩及其相關聯的 HSL 和 RGB 值。

色彩 HSL 值 RGB 值
紅色 (0、240、120) (255, 0, 0)
黃色 (40、240、120) (255、255、0)
綠色 (80、240、120) (0、255、0)
11:青色 (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)