Учебное пособие: Вывод текста
Основы вывода текста
Одно из самых больших преимуществ Windows заключается в достаточно легком использовании большого количества разнообразных высококачественных шрифтов. На этой лекции мы должны будем познакомиться с основными правилами вывода текста и применения шрифтов.
Сначала мы будем разбираться с основными средствами вывода текста. С одной из функций, осуществляющих вывод мы уже встречались:
BOOLTextOut( hDC, nXStart, nYStart, lpsString, wLength );
Эта функция осуществляет вывод строки текста, заданной параметром lpsString, длиной wLength символов, начиная с указанной позиции (nXStart, nYStart) на заданном контексте устройства hDC.
Это самая простая функция, осуществляющая вывод текста в Windows. Однако результат ее применения определяется многими дополнительными параметрами.
Во-первых , цвет выведенного текста задается тремя разными атрибутами контекста устройства: текущим цветом текста, текущим цветом фона и режимом заполнения фона. Ранее мы уже рассматривали эти атрибуты и способы их изменения. Для манипуляций с этими атрибутами предназначены функции:
COLORREFSetTextColor( hDC, crColor );
COLORREF GetTextColor( hDC );
COLORREF SetBkColor( hDC, crColor );
COLORREF GetBkColor( hDC );
int SetBkMode( hDC, nMode );
intGetBkMode( hDC );
Для задания цвета символов используется функция SetTextColor(), которая устанавливает в качестве цвета символов ближайший чистый цвет, доступный на устройстве.
Для задания цвета фона используются два другие атрибута контекста устройства. Если установлен режим заполнения фона OPAQUE (используется по умолчанию), то для заполнения фона под текстом используется текущий цвет фона, который может и не совпадать с фоном окна, который закрашивается кистью. В тех случаях, когда фон под текстом не надо изменять, используется режим TRANSPARENT (при этом атрибут “цвет фона” игнорируется).
Во-вторых , при выводе текста задается его начальная позиция. Определение и использование этой начальной позиции не так-то и просто. Для того, что бы разобраться с этим, нам придется ввести несколько новых терминов, использующихся для определения размера символов и строк.
Символ может размещаться в своей ячейке на некотором расстоянии от всех четырех границ. Для того, что бы можно было определить точные характеристики символов, предназначена специальная функция:
BOOL GetTextMetrics( hDC, lpTEXTMETRIC );
Эта функция заполняет структуру TEXTMETRIC информацией о текущем применяемом шрифте. Сейчас мы рассмотрим только некоторые поля этой структуры, которые определяют размеры символов. Для этого мы приведем изображение символов, на котором будут проставлены размеры так, как они называются в структуре TEXTMETRIC. Позже мы будем возвращаться к отдельным полям этой структуры.
Обычно за высоту строки принимают сумму размеров tmHeight и tmExternalLeading, что позволяет выводить строки, так, чтобы между ними всегда был небольшой промежуток.
Несколько сложнее получается с определением ширины символа и длины строки. Это связано с тем, что Windows может применять как шрифты с фиксированной шириной символа (fixed pitch ), так и пропорциональные (variable pitch ) шрифты. Поэтому в той информации, которую Вы можете получить о шрифте, используются два параметра: максимальная ширина символа tmMaxCharWidth и средняя ширина символа tmAveCharWidth.
Однако пользоваться обеими этими характеристиками очень не удобно. Применение максимальной ширины может давать сильно завышенный результат, а средняя величина может ошибаться в любую сторону. Практически она дает приличное приближение только для длинных строк английского не специального текста, так как для вычисления средней ширины используются частоты встречаемости английских символов.
На практике используют функции, которые позволяет определить точные размеры строки как в высоту, так и в ширину:
DWORD GetTextExtent( hDC, lpsString, wLength );
BOOL GetTextExtentPoint( hDC, lpsString, wLength, lpSize );
Эти функции, определив размеры строки, возвращают результат либо в виде двойного слова (в младшем слове хранится ширина, в старшем - высота строки), либо в структуре типа SIZE, адрес которой Вы указываете. Вместо структуры SIZE может быть использована структура POINT, (так было раньше, что и дало название функции). Обе эти структуры совпадают.
Однако надо сделать небольшое замечание: когда вычисляется высота строки используются значения высот отдельных символов. Поэтому, если Ваша строка состоит из небольших символов, то ее высота может быть существенно меньше, чем полная высота знакоместа.
--> ЧИТАТЬ ПОЛНОСТЬЮ <--