显示允许用户选择特定颜色值的模式对话框。 用户可以从一组基本调色板或自定义调色板中选择颜色。 或者,用户可以通过修改对话框用户界面的 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 时,颜色黑色结果为 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) |