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