Диалоговое окно "Цвет"
Отображает модальное диалоговое окно, позволяющее пользователю выбрать определенное значение цвета. Пользователь может выбрать цвет из набора базовых или настраиваемых цветовой палитры. Кроме того, пользователь может создать значение цвета, изменив RGB или оттенки, насыщенность, светимость (HSL) пользовательского интерфейса диалогового окна. Диалоговое окно цвета возвращает значение RGB цвета, выбранного пользователем.
Вы создаете и отображаете диалоговое окно цвета путем инициализации структуры CHOOSECOLOR и передачи структуры в функцию ChooseColor. Задав различные значения параметров для структуры CHOOSECOLOR, можно повлиять на способ отображения диалогового окна "Цвет". Например, можно отобразить полную или частичную версию пользовательского интерфейса диалогового окна. На следующем рисунке показана полная версия пользовательского интерфейса диалогового окна цвета.
диалоговое окно цвета
Если пользователь нажимает кнопку ОК, SelectColor возвращает TRUE. Элемент rgbResult в структуре CHOOSECOLOR содержит значение цвета RGB цвета, выбранного пользователем. Значение цвета RGB указывает интенсивность отдельных красных, зеленых и синих цветов, составляющих выбранный цвет. Отдельные значения варьируются от 0 до 255. Используйте GetRValue, GetGValueи макросы GetBValue для извлечения отдельных цветов из значения цвета RGB.
Если пользователь отменяет диалоговое окно цвета или возникает ошибка, Выбор Цвета возвращает false, а элемент rgbResult не определен. Чтобы определить причину ошибки, вызовите функцию CommDlgExtendedError, чтобы получить расширенное значение ошибки.
В этом разделе рассматриваются следующие темы.
- диалоговых окнах полного и частичного цвета
- настройка диалогового окна цвета
- цветовой модели, используемые диалогового окна "Цвет"
Диалоговое окно полного и частичного цвета
Диалоговое окно "Цвет" имеет полную версию и частичную версию пользовательского интерфейса. Полная версия включает основные элементы управления и содержит дополнительные элементы управления, позволяющие пользователю создавать пользовательские цвета. Частичная версия содержит элементы управления, отображающие базовые и настраиваемые цветовые палитры, из которых пользователь может выбрать значение цвета.
Частичная версия диалогового окна "Цвет" содержит кнопку Определение настраиваемых цветов. Пользователь может нажать эту кнопку, чтобы отобразить полную версию. Диалоговое окно "Цвет" позволяет всегда отображать полную версию, установив флаг CC_FULLOPEN в элементе Flags структуры 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 использует настраиваемый шаблон вместо шаблона по умолчанию.
Предоставление пользовательского шаблона для диалогового окна "Цвет"
- Создайте пользовательский шаблон, изменив шаблон по умолчанию, указанный в файле Color.dlg. Идентификаторы элементов управления, используемые в шаблоне диалогового окна цвета по умолчанию, определяются в файле Color.dlg.
- Используйте структуру CHOOSECOLOR, чтобы включить шаблон следующим образом:
Если пользовательский шаблон является ресурсом в приложении или библиотеке динамических ссылок, задайте флаг CC_ENABLETEMPLATE в элементе Flags. Используйте hInstance и lpTemplateName члены структуры, чтобы определить имя модуля и ресурса.
-Или-
Если пользовательский шаблон уже находится в памяти, задайте флаг CC_ENABLETEMPLATEHANDLE. Используйте элемент hInstance для идентификации объекта памяти, содержащего шаблон.
Вы можете предоставить процедуру перехватчика CCHookProc для диалогового окна "Цвет". Процедура перехватчика может обрабатывать сообщения, отправленные в диалоговое окно. Он также может использовать зарегистрированные сообщения для управления поведением диалогового окна. Если вы используете пользовательский шаблон для определения дополнительных элементов управления, необходимо предоставить процедуру перехватчика для обработки входных данных для элементов управления.
Включение процедуры перехватчика для диалогового окна "Цвет"
- Задайте флаг CC_ENABLEHOOK в элементе Flags структуры CHOOSECOLOR.
- Укажите адрес процедуры перехватчика в элементе 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) |