“颜色”对话框

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

Color RGB 值
Red 255, 0, 0
绿色 0, 255, 0
蓝色 0, 0, 255
青色 0, 255, 255
洋红色 255, 0, 255
黄色 255, 255, 0
White 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 值。

Color HSL RGB 值
Red (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)
White (0、0、240) (255、255、255)
黑色 (0, 0, 0) (0, 0, 0)