色彩對話方塊
顯示可讓使用者選擇特定色彩值的強制回應對話方塊。 使用者可以從一組基本或自訂調色盤中選擇色彩。 或者,使用者可以修改對話方塊使用者介面的 RGB 或色調、飽和度、亮度 (HSL) 色彩值來產生色彩值。 [ 色彩 ] 對話方塊會傳回使用者所選取色彩的 RGB 值。
您可以藉由初始化CHOOSECOLOR結構,並將結構傳遞至ChooseColor函式,來建立並顯示[色彩] 對話方塊。 藉由設定 CHOOSECOLOR 結構的不同參數值,您可以影響 [色彩] 對話方塊的顯示方式。 例如,您可以顯示對話方塊的完整或部分使用者介面版本。 下圖顯示 [ 色彩 ] 對話方塊的完整使用者介面版本。
如果使用者按一下 [ 確定 ] 按鈕, ChooseColor 會傳回 TRUE。 CHOOSECOLOR結構的rgbResult成員包含使用者所選取色彩的 RGB 色彩值。 RGB 色彩值會指定組成所選色彩之個別紅色、綠色和藍色的強度。 個別值的範圍從 0 到 255。 使用 GetRValue、 GetGValue和 GetBValue 宏,從 RGB 色彩值擷取個別色彩。
如果使用者取消 [ 色彩 ] 對話方塊或發生錯誤, ChooseColor 會傳回 FALSE ,而且未定義 rgbResult 成員。 若要判斷錯誤的原因,請呼叫 CommDlgExtendedError 函 式來擷取擴充的錯誤值。
本節涵蓋下列主題
完整和部分色彩對話方塊
[色彩] 對話方塊具有完整版本和部分版本的使用者介面。 完整版本包含基本控制項,並具有可讓使用者建立自訂色彩的其他控制項。 部分版本具有控制項,可顯示使用者可從中選取色彩值的基本和自訂調色盤。
[色彩] 對話方塊的部分版本包含 [ 定義自訂色彩 ] 按鈕。 使用者可以按一下此按鈕以顯示完整版本。 您可以在CHOOSECOLOR結構的Flags成員中設定CC_FULLOPEN旗標,以指示 [色彩] 對話方塊一律顯示完整版本。 若要防止使用者建立自訂色彩,您可以設定 CC_PREVENTFULLOPEN 旗標來停用 [ 定義自訂色彩 ] 按鈕。
基本色彩代表指定裝置上可用色彩的選取範圍。 顯示的實際色彩數目是由顯示驅動程式決定。 例如,VGA 驅動程式會顯示 48 種色彩,而單色顯示器驅動程式只會顯示 16。
自訂色彩是您指定的色彩,或是使用者建立的色彩。 當您建立 [色彩] 對話方塊時,必須使用CHOOSECOLOR結構的lpCustColors成員來指定 16 個自訂色彩的初始值。 如果 [色彩] 對話方塊的完整版本已開啟,使用者可以透過下列其中一種方法來建立自訂色彩:
- 移動色彩頻譜控制項中的游標和亮度投影片控制項
- 在 紅色、 綠色和 藍色 編輯控制項中輸入 RGB 值
- 在 Hue、 Sat和 Lum 編輯控制項中輸入 HSL 值
若要將新的自訂色彩新增至自訂色彩顯示,使用者可以按一下 [ 新增至自訂色彩 ] 按鈕。 這也會導致對話方塊將新色彩的 RGB 值複製到 lpCustColors 成員所指向陣列中的對應元素。 若要在對 ChooseColor的呼叫之間保留新的自訂色彩,您應該為數組配置靜態記憶體。 如需 RGB 和 HSL 色彩模型的詳細資訊,請參閱 色彩對話方塊使用的色彩模型。
自訂色彩對話方塊
若要自訂 [色彩] 對話方塊,您可以使用下列任何方法:
- 當您建立對話方塊時,請在 CHOOSECOLOR 結構中指定值
- 提供自訂範本
- 提供攔截程式
您可以在CHOOSECOLOR結構的Flags成員中設定旗標,以修改 [色彩] 對話方塊的外觀和行為。 例如,您可以設定 CC_SOLIDCOLOR 旗標,以指示對話方塊只顯示純色。 若要讓對話方塊一開始選取黑色以外的色彩,請設定 CC_RGBINIT 旗標,並在 rgbResult 成員中指定色彩。
例如,如果您想要包含應用程式唯一的其他控制項,您可以為 [色彩] 對話方塊提供自訂範本。 ChooseColor函式會使用您的自訂範本取代預設範本。
提供 [色彩] 對話方塊的自訂範本
- 修改 Color.dlg 檔案中指定的預設範本,以建立自訂範本。 預設 [色彩] 對話方塊範本中使用的控制項識別碼定義于 Color.dlg 檔案中。
- 使用 CHOOSECOLOR 結構來啟用範本,如下所示:
如果您的自訂範本是應用程式或動態連結程式庫中的資源,請在Flags成員中設定CC_ENABLETEMPLATE旗標。 使用 結構的 hInstance 和 lpTemplateName 成員來識別模組和資源名稱。
-或-
如果您的自訂範本已在記憶體中,請設定 CC_ENABLETEMPLATEHANDLE 旗標。 使用 hInstance 成員來識別包含範本的記憶體物件。
您可以為 [色彩] 對話方塊提供 CCHookProc 攔截程式。 攔截程式可以處理傳送至對話方塊的訊息。 它也可以使用已註冊的訊息來控制對話方塊的行為。 如果您使用自訂範本來定義其他控制項,則必須提供勾點程式來處理控制項的輸入。
啟用 [色彩] 對話方塊的勾點程式
- 在CHOOSECOLOR結構的Flags成員中設定CC_ENABLEHOOK旗標。
- 在 lpfnHook 成員中指定攔截程式的位址。
處理其 WM_INITDIALOG 訊息之後,對話方塊程式會將 WM_INITDIALOG 訊息傳送至攔截程式。 此訊息的 lParam 參數是用來初始化對話方塊之 CHOOSECOLOR 結構的指標。
當使用者按一下 [確定] 按鈕時,對話方塊會將COLOROKSTRING已註冊的訊息傳送至勾點程式。 攔截程式可以拒絕選取的色彩,並在收到此訊息時強制對話方塊保持開啟狀態。 攔截程式可以將 SETRGBSTRING 已註冊的訊息傳送至對話方塊,強制對話方塊選取特定色彩。 若要使用這些已註冊的訊息,您必須將 COLOROKSTRING 和 SETRGBSTRING 常數傳遞至 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 值。 使用 GetRValue、 GetBValue和 GetGValue 宏,從 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) |