- •Часть 2 (продолжение): Прикладное программирование в Windows
- •Глава 8. Виртуальное окно: работа с текстом
- •8.1. Оконные координаты, цвета, отображение строк
- •Кодировка rgb-значений
- •Размеры системных метрик
- •8.2. Виртуальное окно
- •Способы заполнения прямоугольной области
- •8.3. Изменение шрифтов
- •Макроимена распространенных шрифтов
- •8.4. Создание собственных шрифтов
- •Глава 9. Программирование графики
- •9.1. Логическая система координат
- •Рекомендуемый самый яркий состав цветов
- •9.2. Пиксели, линии, дуги, прямоугольники, эллипсы и секторы
- •9.3. Работа с перьями и кистями
- •Типы линий, создаваемых пером
- •9.4. Технология виртуального окна
- •9.5. Режимы отображения и области вывода
- •Текущий режим отображения (mappind mode)
- •Глава 10. Работа с панелями инструментов
- •10.1. Общие элементы управления
- •Общие элементы управления
- •10.2. Подключение и инициализация общих элементов управления
- •10.3. Работа с панелью инструментов
- •Начальные состояния кнопок панели инструментов
- •Стиль кнопки определяется (значения поля fsStyle)
- •Сообщения к панели инструментов
- •10.4. Создание растрового изображения для панели инструментов
- •10.5. Включение подсказок
- •Глава 11. Спины, ползунки и индикаторы процессов
- •11.1. Работа со спином
- •Стили «up-down control»
- •Сообщения, которые можно посылать спину
- •11.2. Создание спина с «приятельским» окном
- •11.3. Работа с ползунком
- •Значения стилей для ползунка
- •Перечень сообщений, которые можно посылать ползунку
- •Перечень нотификационных сообщения ползунка
- •11.4. Индикатор процесса
- •Управляющие сообщения индикатору
- •Глава 12. Многозадачность: процессы и потоки
- •12.1. Создание нового процесса (отдельной задачи)
- •Разрешенные значения поля dwFlags
- •12.2. Многопотоковые программы
- •12.3. Работа с несколькими потоками
- •12.4. Синхронизация процессов и потоков: семафоры
- •12.5. Обработка событий
- •Глава 13. Приемы программного управления вычислительным процессом
- •13.1. Использование функций Проводника Explorer для работы в файловой системе
- •Управляющая информация Проводника
- •Режимы обработки файлов
- •13.2. Создание собственных динамических библиотек (dll-файлов)
- •13.3. Работа с буфером обмена Clipboard
- •Функции подсистемы Clipboard
- •Свойства выделяемого блока памяти
- •Форматы и типы данных
- •Литература
Глава 8. Виртуальное окно: работа с текстом
В примерах, приведенных в предыдущих главах, весь вывод информации выполнялся при помощи окон сообщений или элементов управления диалога, а рабочая область окна не использовалась. Здесь мы вернемся к рабочей области окна и рассмотрим некоторые вопросы работы с текстами в Windows, а также основные приемы по созданию виртуальных окон, которые упрощают перерисовку окна. Завершается эта глава обсуждением возможностей использования различных шрифтов для вывода текста на экран в приложениях.
Что же касается других аспектов программирования в среде Windows, то нужно сказать, что программист имеет практически неограниченные возможности по управлению выводом текста в рабочей области окна. Естественно, в этой главе невозможно описать все аспекты работы с текстом в Windows. Однако она содержит достаточно информации, используя которую Вы сможете без труда разобраться во всех остальных вопросах, связанных с манипулированием текстом.
В начале главы вводится понятие системы координат в окне. Затем описываются основные функции API, использующиеся для работы с текстом и с экраном, которые позволяют управлять выводом текста в рабочей области окна.
8.1. Оконные координаты, цвета, отображение строк
Оконные координаты. Как известно, TextOut() является стандартной функцией вывода текста в Windows. Она выводит текст в заданных координатах, которые всегда указываются относительно начала рабочей области окна. Таким образом, координаты строки, выводимой при помощи TextOut(), не зависят от положения самого окна на экране. По умолчанию координаты начала (верхнего левого угла) рабочей области равны нулю. Координата по оси X увеличивается при движении вправо, а координата по оси Y – при движении вниз.
До сих пор при задании координат в функции TextOut() и для позиционирования элементов в диалоге нас не интересовали единицы измерения координат. Сейчас следует подробнее рассмотреть этот вопрос. Прежде всего отметим, что координаты, задаваемые в TextOut(), являются логическими координатами. То есть единицы измерения координат для TextOut() (и любых других функций, отображающих что-либо на экране, включая функции вывода фафики, которые описаны в следующей главе) являются логическими единицами. В процессе вывода изображения на экран Windows преобразует логические единицы в пикселы. До сих пор нам не нужно было беспокоиться по этому поводу, поскольку по умолчанию логические единицы как раз и являются пикселами. Однако следует иметь в виду, что в Windows можно использовать различные режимы отображения (mappind modes), в которых подобное умолчание не работает.
Установка цветов текста и фона. При использовании функции TextOut() текст отображается на экране черным цветом на текущем фоне окна. Существует также возможность явного задания цвета текста и фона для него с помощью функций API SetTextColor() и SetBkColor():
COLORREF SetTextColor(HOC hdc, COLORREF color);
COLORREF SetBkColor (HDC hdc, COLORREF color);
Функция SetTextColor устанавливает текущий цвет текста для устройства, ассоциированного с контекстом hdc. Цвет задается параметром color (при этом устройство может выбирать реальный цвет, ближайший к задаваемому, который оно в состоянии отобразить). Функция SetBkColor() устанавливает цвет фона текста (или ближайший к нему возможный для устройства), задаваемый параметром color. Обе функции возвращают предыдущую установку соответствующего цвета, а при возникновении ошибки – значение CLR_INVALID.
Цвет задается 32-битовым целым типа COLORREF. Windows позволяет задать цвет тремя различными способами. Первый, и наиболее общий, способ заключается в задании RGB-значения (Red, Green, Blue). RGB-значение комбинирует относительные интенсивности трех различных цветов, в результате чего получается реальный цвет. Второй способ определения цвета предполагает задание индекса цвета в логической палитре, а третий заключается в определении RGB-значения относительно текущей логической палитры. В этой главе используется только первый способ задания цвета.
Длинное целое, хранящее RGB-значение и передаваемое в качестве параметра в функции SetTextColor() и SetBkColor(), кодируется следующим образом (табл. 8.1.):
Таблица 8.1
