Поделиться через


Диалоговое окно "Цвет"

Отображает модальное диалоговое окно, позволяющее пользователю выбрать определенное значение цвета. Пользователь может выбрать цвет из набора базовых или пользовательских цветовых палитр. Кроме того, пользователь может создать значение цвета, изменив значения цветов RGB или оттенка, насыщенности, яркости (HSL) пользовательского интерфейса диалогового окна. Диалоговое окно Цвет возвращает RGB-значение цвета, выбранного пользователем.

Диалоговое окно Цвет создается и отображается путем инициализации структуры CHOOSECOLOR и передачи структуры в функцию ChooseColor . Задавая различные значения параметров для структуры CHOOSECOLOR , можно повлиять на то, как отображается диалоговое окно Цвет. Например, можно отобразить полную или частичную версию пользовательского интерфейса диалогового окна. На следующем рисунке показана полная версия пользовательского интерфейса диалогового окна Цвет .

Диалоговое окно цвета

Если пользователь нажимает кнопку ОК , функция ChooseColor возвращает значение TRUE. Элемент rgbResult структуры CHOOSECOLOR содержит rgb-значение цвета, выбранного пользователем. Значение цвета RGB указывает интенсивность отдельных красных, зеленых и синих цветов, составляющих выбранный цвет. Отдельные значения варьируются от 0 до 255. Используйте макросы GetRValue, GetGValue и GetBValue для извлечения отдельных цветов из значения цвета RGB.

Если пользователь отменяет диалоговое окно Цвет или возникает ошибка, функция ChooseColor возвращает значение FALSE , а элемент rgbResult не определен. Чтобы определить причину ошибки, вызовите функцию CommDlgExtendedError , чтобы получить расширенное значение ошибки.

В этом разделе рассматриваются следующие темы:

Диалоговые окна "Полный и частичный цвет"

Диалоговое окно Цвет содержит полную и частичную версию пользовательского интерфейса. Полная версия включает базовые элементы управления и дополнительные элементы управления, позволяющие пользователю создавать пользовательские цвета. Частичная версия содержит элементы управления, отображающие базовую и пользовательскую цветовую палитру, из которой пользователь может выбрать значение цвета.

Частичная версия диалогового окна Цвет включает кнопку Определить пользовательские цвета . Пользователь может нажать эту кнопку, чтобы отобразить полную версию. В диалоговом окне Цвет можно всегда отображать полную версию, установив флаг CC_FULLOPEN в элементе Флаги структуры CHOOSECOLOR . Чтобы запретить пользователю создавать пользовательские цвета, можно установить флаг CC_PREVENTFULLOPEN , чтобы отключить кнопку Определить пользовательские цвета .

Основные цвета представляют собой выбор цветов, доступных на указанном устройстве. Фактическое количество отображаемых цветов определяется драйвером отображения. Например, драйвер VGA отображает 48 цветов, а драйвер монохромного дисплея — только 16.

Пользовательские цвета — это цвета, которые вы указываете или создает пользователь. При создании диалогового окна Цвет необходимо использовать элемент lpCustColors структуры CHOOSECOLOR , чтобы указать начальные значения для 16 пользовательских цветов. Если открыта полная версия диалогового окна Цвет, пользователь может создать пользовательский цвет одним из следующих способов:

  • Перемещение курсора в элементе управления цветового спектра и слайде яркости
  • Ввод значений RGB в элементах управления " Красный", "Зеленый" и "Синий "
  • Ввод значений HSL в элементах управления " Hue", "Sat" и "Lum "

Чтобы добавить новый пользовательский цвет на отображение пользовательских цветов, пользователь может нажать кнопку Добавить в пользовательские цвета . Это также приводит к тому, что диалоговое окно скопирует rgb-значение нового цвета в соответствующий элемент в массиве, на который указывает элемент lpCustColors . Чтобы сохранить новые пользовательские цвета между вызовами ChooseColor, необходимо выделить статическую память для массива. Дополнительные сведения о цветовых моделях RGB и HSL см. в разделе Цветовые модели, используемые диалоговым окном "Цвет".

Настройка диалогового окна "Цвет"

Чтобы настроить диалоговое окно Цвет, можно использовать любой из следующих методов:

  • Указание значений в структуре CHOOSECOLOR при создании диалогового окна
  • Предоставление пользовательского шаблона
  • Предоставление процедуры перехватчика

Внешний вид и поведение диалогового окна Цвет можно изменить, установив флаги в элементе Флаги структуры CHOOSECOLOR . Например, можно задать флаг CC_SOLIDCOLOR , чтобы в диалоговом окне отображались только сплошные цвета. Чтобы диалоговое окно изначально выбирал цвет, отличный от черного, установите флаг CC_RGBINIT и укажите цвет в элементе rgbResult .

Вы можете указать пользовательский шаблон для диалогового окна Цвет, например, если требуется включить дополнительные элементы управления, уникальные для вашего приложения. Функция ChooseColor использует пользовательский шаблон вместо шаблона по умолчанию.

Предоставление пользовательского шаблона для диалогового окна "Цвет"

  1. Создайте пользовательский шаблон, изменив шаблон по умолчанию, указанный в файле Color.dlg. Идентификаторы элементов управления, используемые в шаблоне диалогового окна цвета по умолчанию, определяются в файле Color.dlg.
  2. Используйте структуру CHOOSECOLOR , чтобы включить шаблон следующим образом:
    • Если пользовательский шаблон является ресурсом в приложении или библиотеке динамической компоновки, установите флаг CC_ENABLETEMPLATE в элементе Flags . Используйте элементы hInstance и lpTemplateName структуры для идентификации модуля и имени ресурса.

      -Или-

    • Если пользовательский шаблон уже находится в памяти, установите флаг CC_ENABLETEMPLATEHANDLE . Используйте элемент hInstance для идентификации объекта памяти, содержащего шаблон.

Вы можете указать процедуру перехватчика CCHookProc для диалогового окна Цвет. Процедура перехватчика может обрабатывать сообщения, отправленные в диалоговое окно. Он также может использовать зарегистрированные сообщения для управления поведением диалогового окна. Если вы используете пользовательский шаблон для определения дополнительных элементов управления, необходимо предоставить процедуру перехватчика для обработки входных данных для элементов управления.

Включение процедуры перехватчика для диалогового окна "Цвет"

  1. Установите флаг CC_ENABLEHOOK в элементе Flags структуры CHOOSECOLOR .
  2. Укажите адрес процедуры перехватчика в элементе 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
White 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)
White (0, 0, 240) (255, 255, 255)
Черный (0, 0, 0) (0, 0, 0)