
- •Глава 3 Рисование текста
- •Рисование и обновление
- •Сообщение wm_paint
- •Действительные и недействительные прямоугольники
- •Введение в графический интерфейс устройства (gdi)
- •Контекст устройства
- •Получение описателя контекста устройства. Первый метод
- •Структура информации о рисовании
- •Получение описателя контекста устройства. Второй метод
- •Функция TextOut. Подробности
- •Системный шрифт
- •Размер символа
- •Метрические параметры текста. Подробности
- •Форматирование текста
- •Соединим все вместе
- •Оконная процедура программы sysmets1.С
- •Не хватает места!
- •Размер рабочей области
- •Полосы прокрутки
- •Диапазон и положение полос прокрутки
- •Сообщения полос прокрутки
- •Прокрутка в программе sysmets
- •Структурирование вашей программы для рисования
- •Создание улучшенной прокрутки
- •Мне не нравится пользоваться мышью
Оконная процедура программы sysmets1.С
Оконная процедура WndProc программы SYSMETS1.С обрабатывает три сообщения: WM_CREATE, WM_PAINT и WM_DESTROY. Сообщение WM_DESTROY обрабатывается точно также, как и в программе HELLOWIN, рассмотренной в главе 2.
Сообщение WM_CREATE является первым сообщением, получаемым оконной процедурой. Оно генерируется операционной системой Windows, когда функция CreateWindow создает окно. При обработке сообщения WM_CREATE SYSMETS1 получает контекст устройства для окна путем вызова функции GetDC, а также размеры текста для системного шрифта по умолчанию путем вызова функции GetTextMetrics. SYSMETS1 сохраняет усредненное значение ширины символа в cxChar и полную высоту символов (включая поле tmExternalLeading) в cyChar.
SYSMETS1 также сохраняет среднюю ширину символов верхнего регистра в статической переменной cxCaps. Для фиксированного шрифта cxCaps была бы равна cxChar. Для пропорционального шрифта cxCaps равна 150% от cxChar. Младший бит поля tmPitchAndFamily структуры TEXTMETRIC равен 1 для пропорционального шрифта и 0 для фиксированного. SYSMETS1 использует значение этого бита для расчета cxCaps из cxChar следующим образом:
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
SYSMETS1 полностью выполняет процедуру рисования окна во время обработки сообщения WM_PAINT. Как правило, оконная процедура путем вызова BeginPaint, получает, в первую очередь, описатель контекста устройства. В цикле for обрабатываются все элементы структуры sysmetrics, определенной в SYSMETS.H. Три колонки текста выводятся на экран тремя функциями TextOut. В каждом случае третий параметр TextOut — это выражение:
cyChar * (1 + i)
Этот параметр показывает в пикселях положение верхней границы строки символов относительно верхней границы рабочей области. Таким образом программа делает верхний отступ равным cyChar. Первая строка текста (если i равно 0) начинается на cyChar пикселей ниже верхней границы рабочей области.
Первая инструкция TextOut выводит на экран в первую колонку идентификаторы, написанные прописными буквами. Вторым параметром TextOut является cxChar. Он оставляет левый отступ между первым символом строки и левой границей рабочей области окна равным одному символу. Текст берется из поля szLabel структуры sysmetrics. Функция периода выполнения strlen языка С используется для получения длины строки, которая необходима в качестве последнего параметра для TextOut.
Вторая инструкция TextOut выводит на экран описание значений системных размеров. Эти описания хранятся в поле szDesc структуры sysmetrics. В этом случае второй параметр TextOut — это выражение:
cxChar + 22 * cxCaps
Максимальная длина идентификаторов, выводимых на экран в первой колонке прописными буквами, составляет 20 символов, поэтому вторая колонка должна начинаться в позиции, по крайней мере, на 20* cxCaps правее начала первой колонки текста.
Третий оператор TextOut выводит на экран численные значения, полученные от функции GetTextMetrics. Пропорциональный шрифт делает форматирование колонки, выравненных по правому краю чисел, слегка обманчивым. Каждая цифра от 0 до 9 имеют одну и ту же ширину, но эта ширина больше, чем ширина пробела. Числа могут быть шириной в одну или более цифр, поэтому начальное горизонтальное положение чисел может меняться от строки к строке.
Возможно, было бы проще, если бы мы выводили колонку выравненных по правому краю чисел, задав положение последней цифры, вместо первой. Это позволяет делать функция SetTextAlign. После вызова этой функции в программе SYSMETS1:
SetTextAlign (hdc, TA_RIGHT | TA_TOP);
координаты, переданные последующим функциям TextOut, будут задавать правый верхний угол строки текста вместо ее левого верхнего угла.
Второй параметр функции TextOut для вывода колонки чисел — это выражение:
cxChar + 22 * cxCaps + 40 * cxChar
Значение 40 * cxChar позволяет согласовать ширину второй колонки и ширину третьей колонки. Следующий за функцией TextOut другой вызов функции SetTextAlign возвращает все в исходное состояние на время до начала следующего цикла.