Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

8.2.1 Системные цвета

Windows поддерживает 25 системных цветов, предназначенных для рисования различных элементов экрана. Вы можете получить и установить текущие значения этих цветов с помощью функций GetSysColor и SetSysColors. Идентификаторы, определенные в заголовочных файлах Windows, задают системный цвет. Установка системного цвета с помощью функции SetSysColors меняет его только на время текущего сеанса работы Windows.

Вы можете изменить некоторые (но не все) системные цвета, используя раздел Display окна Control Panel, или модифицируя секцию [colors] отображения файла WIN.INI в реестре. Секция [colors] использует ключевые слова (отличные от идентификаторов функций GetSysColor и SetSysColors) для 25 системных цветов, которым соответствуют тройка чисел в диапазоне от 0 до 255, представляющая значения красного, зеленого и голубого. Следующая таблица показывает, как 25 системных цветов идентифицируются с помощью констант, используемых в функциях GetSysColor и SetSysColors, а также с помощью ключевых слов файла WIN.INI. Таблица построена последовательно в порядке возрастания значений констант COLOR_ от 0 до 24:

Задаваемые по умолчанию значения этих 25 цветов обеспечиваются драйвером дисплея. Windows использует эти задаваемые по умолчанию значения до тех пор, пока они не заменяются значениями из секции [colors] файла WIN.INI, которые могут быть изменены через Control Panel.

Теперь плохие новости: хотя смысл многих из этих цветов кажется очевидным (например, COLOR_BACKGROUND — это цвет фона области desktop), использование системных цветов в Windows весьма хаотично. Первые версии Windows выглядели намного проще, чем сейчас. Действительно, до появления Windows 3.0 определялись только первые 13 из приведенных выше системных цветов. В связи с возросшим применением визуально более сложных дочерних окон управления, использующих трехмерные изображения, понадобилось увеличить количество системных цветов.

8.2.2 Цвета кнопок

Эта проблема особенно очевидна для кнопок: цвет COLOR_BTNFACE является основным цветом поверхности нажимаемых кнопок и цветом фона остальных. (Этот же цвет используется в окнах диалога и сообщений.) Цвет COLOR_BTNSHADOW предназначен для затенения правой и нижней сторон нажимаемых кнопок, для внутренней поверхности квадратов флажков и кружков переключателей. Для нажимаемых кнопок COLOR_BTNTEXT используется как цвет текста, а для других кнопок таким цветом является COLOR_WINDOWTEXT. Несколько других системных цветов также используются для различного оформления кнопок.

Поэтому, если мы хотим изображать кнопки на поверхности нашей рабочей области, то один из способов избежать конфликта цветов, это настроиться на системные цвета. Для начала, при определении класса окна для фона рабочей области вашего окна используйте COLOR_BTNFACE:

wndclass.hbrBackground =(HBRUSH)(COLOR_BTNFACE + 1);

Вы можете проверить это в программе BTNLOOK. Windows понимает, что если значение hbrBackground структуры WNDCLASSEX такое низкое, то оно фактически ссылается на системный цвет, а не на реальный описатель. Windows требует, чтобы вы при использовании этих идентификаторов прибавляли 1, когда задаете их в поле hbrBackground структуры WNDCLASSEX, только для того, чтобы это значение не стало равным NULL. Если окажется, что системный цвет при выполнении программы изменяется, тогда поверхность вашей рабочей области станет недействительной, и Windows для ее обновления будет использовать новое значение COLOR_BTNFACE.

Но теперь возникла новая проблема. Если вы выводите текст на экран, используя функцию TextOut, то Windows для цвета фона текста (цвет, которым стирается фон позади текста) и цвета самого текста использует значения, определенные в контексте устройства. Задаваемыми по умолчанию значениями являются белый (фон) и черный (текст) вне зависимости от системных цветов и от поля hbrBackground структуры класса окна. Поэтому, для изменения цвета текста и его фона на системные цвета, вам нужно использовать функции SetTextColor и SetBkColor. Делайте это после получения описателя контекста устройства:

SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));

SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));

Теперь цвет фона рабочей области, цвет фона текста и цвет самого текста — все вместе приведены в соответствие с цветом кнопок.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]