Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум «Основы разработки приложений Windows» книга 2.DOC
Скачиваний:
91
Добавлен:
10.05.2014
Размер:
827.9 Кб
Скачать

Вывод на экран текстовых строк

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

  • в функции OnCreate()обработки сообщенияWM_CREATEсоздаются необходимые шрифты, а их дескрипторы запоминаются в глобальных переменных;

  • в функции OnPaint()обработки сообщенийWM_PAINTс помощью макросаSelectFont()в контекст устройства вы­бирается дескриптор требуемого шрифта;

  • при необходимости в контексте устройства устанавливаются требуемые характеристики шрифта – цвет и прозрачность фона;

  • с помощью функций TextOut()илиDrawText()в окно приложения выводятся требуемые строки.

Функция TextOut()позволяет вывести в окно приложения строку текста, начиная с точно заданной точки, координаты которой в виде номеров пикселов указываются в параметрах функции. Координаты относятся к верхнему левому углу знакоместа. Поскольку шрифты в Windows могут иметь различный размер, высота знакоместа обычно заранее неизвестна, и для того чтобы последовательные строки не накладывались друг на друга, необходимо с помощью структуры типаTEXTMETRICи функцииGetTextMet­rics()определить высоту символов и, исходя из этой величины, задавать координаты следующих строк. Эта процедура была описана в пособии [1].

Функция DrawText()позиционирует текст по-другому. Из ее прототипа, взятого из интерактивного справочника

int DrawText(HDC hDC, LPCTSTR lpString, int nCount,

LPRECT lpRect, UINT uFormat);

видно, что в качестве ее параметров выступают: дескриптор контекста устройства hDC, адрес выводимой строкиlpString, длина выводимой строкиnCount, адресlpRectструктурной переменной типаRECTс координатами прямоугольной области экрана, в которую выводится текст, а также константа форматирования текстаuFormat.

Функция DrawText()выводит заданный текст в указанную прямоугольную область (которая может быть и гораздо больше выводимой строки по размеру), причем расположение текста внутри области определяется последним параметром функции. Использованная в приводимом ниже примере символическая константаDT_CENTERпозиционирует текст по горизонтали по центру прямоугольника (рис. 2.1).

Рис. 2.1. Расположение текстовой строки в главном окне приложения при использовании функции DrawText()

Текст может быть позиционирован также по левому краю заданной прямоугольной области (константа DT_LEFT) или по правому краю (константаDT_RIGHT).

Если текст состоит из одной строки, а высота области превышает высоту текста, то строку можно позиционировать и по вертикали, для чего используются константы DT_VCENTER,DT_BOTTOMилиDT_TOP. Позиционирование по вертикали требует явного объявления текста однострочным с помощью константыDT_SINGLE­LINE. Все константы позиционирования можно комбинировать с помощью побитовой операции ИЛИ (символ|языка С++).

Вывод текстовых строк с помощью функции DrawText()очень удобен в плане задания аккуратного расположения строк, хотя и оказывается более сложным, чем при использовании функцииTextOut(). Ниже приведен текст функцииOnPaint(), использованной при приложении, вывод которого приведен на рис. 2.1:

void OnPaint(HWND hwnd){

PAINTSTRUCTps;

RECTr;//Прямоугольная область для вывода строки текста

char s[]="Строка текста";//Сама строка

HDChdc=BeginPaint(hwnd,&ps);//Получим контекст устройства

r.left=5;//Задаем координаты прямоугольника

r.top=30;//в пределах главного окна

r.right=ps.rcPaint.right-5;//Ради симметрии по горизонтали

r.bottom=80;//Высота прямоугольника почти произвольна

SelectFont(hdc,hFont);//Выбираем крупный шрифт

//(созданный заранее)

SetBkMode(hdc,TRANSPARENT);//Назначаем прозрачность фона

DrawText(hdc,s,strlen(s),&r,//Собственно вывод строки

DT_CENTER|DT_VCENTER|DT_SINGLELINE);//Центрируем

EndPaint(hwnd,&ps);

}

Ширина окна здесь получена из структурной переменной ps, где она входит в состав элементаrcPaintтипаRECT.