КАК поменять шрифт у текста в окне?

КАК вывести строку текста?
КАК выровнять текст в окне по вертикали или горизонтали?
КАК поменять шрифт?
КАК поменять цвет текста?
КАК убрать белый фон за текстом?

КАК развернуть шрифт?

Мы договорились, что всё, что связано с рисованием, по возможности обрабатывается в блоке сообщения WM_PAINT.
Опираясь на ваш опыт программирования графики под DOS, спешу предложить то же, но для Windows. В отличие от DOS, мы выводим текст и графические примитивы не прямо на экран (то есть в видеобуфер), в наше окно. Чтобы программа поняла, что рисовать надо именно в данном конкретном окне (у одной программы их может быть десятки), мы выделяем контекст графического устройства HDC. Во всех графических функциях первый аргумент - контекст.

Итак, вывод текста. Что нам может потребоваться? Вывести текст где угодно, какого угодно цвета, какого угодно размера, какого угодно шрифта. Для Windows нет ничего проще. Как и в любой программе вроде Microsoft Frontpage мы работаем над дизайном шрифта, так можем мы с ним работать и в окне.

КАК вывести строку текста?

Вы уже знакомы с функцией TextOut(), которая выводит текстовую строку с заданными координатами. Именно она писала нам: "Hello, Win32 API!!!" в первой программе. На самом деле возможности её более богаты. Синтаксис у неё такой:

BOOL TextOut(HDC hdc, int x, int y, LPCTSTR lpString, int cbString); // Привет

Аргументы:
1. hdc - контекст графического устройства.
2. x ,y - координаты текста, отсчёт которых ведётся из левого верхнего угла окна вниз и вправо.
3. lpString - сам текст
4. cbString - длина строки. Обычно подключают библиотеку string.h и пишут так: strlen(lpString), если вам надо вывести всю строку. Видите, какие подробные API функции? Подразумевается, что мы можем захотеть вывести не всю строку, а только её часть!

КАК выровнять текст по вертикали или по горизонтали?

Функция SetTextAlign задаёт выравнивание текста:

UINT SetTextAlign(HDC hdc, UINT fMode);

Парметры этой функции:
1. hdc - контекст устройства
2. fMode - флаг выравнивания. Можно задать выравнивание по вертикали (TA_TOP, TA_BASELINE, TA_BOTTOM) и по горизонтали. (TA_LEFT, TA_RIGHT, TA_CENTER).

Вот пример:

SetTextAlign(hdc, TA_CENTER|TA_BASELINE|TA_UPDATECP);


Есть ещё флаг TA_UPADTECP - вывод текста с текущей позиции, игнорируя параметры в скобках.

КАК поменять шрифт?

Один из способов установки шрифта в WinAPI: заполнение структуры LOGFONT. Вот лишь некоторые из полей этой огромной структуры, которые могут нам понадобиться:

lfCharSet - задаёт набор требуемых символов (кодировку). Может принимать одно из значений: OEM_CHARSET, ANSI_CHARSET и др. Это необходимо если, например, мы собираемся выводить текст не только на английском. Как известно, каждый язык содержит в своём алфавите какие-то дополнительные символы, которые могут отображаться неправильно при неверном выборе кодировки. Если вы ошибетесь с кодировкой, то корректно будут отображаться только английские символы, а все остальные будут подменяться какими-то случайными значениями, соответствующими данному коду, или вообще знаками "?". При наприсании программ на русском языке, лучшее, что мы можем сделать - установить кодировку DEFAULT_CHARSET, таким образом если у пользователя установлен русский язык в операционной системе, наш текст будет отображаться правильно.
lfPitchAndFamily - задаёт ширину символов и определяет семейство шрифтов. С параметром: DEFAULT_PITCH для не имеет значения, имеет шрифт переменную ширину или фиксированную, FIXED_PITCH - ширина символов строго фиксирована, VARIABLE_PITCH - ширина переменная.
lfHeight - высота шрифта
lfWidth - ширина символов, с помощью этого параметра мы задаём жирный шрифт, причем насколько жирный мы должны указать сами
lfItalic - если это поле не равно 0, шрифт будет курсивный
lfUnderline - если это поле не равно 0, шрифт будет подчёркнутый
lfFaceName - имя шрифта

Когда все поля LOGFONT заполнены, мы передаем ссылку на структуру функции CreateFontIndirect, которая возвращает дескриптор созданного шрифта hfont. Вот как это выглядит:

static LOGFONT lf; //создаём экземпляр структуры LOGFONT

lf.lfCharSet=DEFAULT_CHARSET; //заполняем необходимые поля
lf.lfPitchAndFamily = DEFAULT_PICH;
...
HFONT hFont;
hFont=CreateFontIndirect(&lf); //создаём объект HFONT на основе заполненной стрктуры
SelectObject(hdc, hFont); //шрифт будет иметь силу только когда мы его выберем текущим

TextOut(hdc, 10,10, str, strlen(str)); //выводим текст. Он будет уже с новым шрифтом


Привожу фрагмент программы, которая выводит строку с заданным шрифтом:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
char *str="Привет, Win32 API!!!";

{
PAINTSTRUCT ps; //экземпляр структуры рисования
HDC hdc=BeginPaint(hWnd, &ps); //создаём контекст устройства и показываем, что собираемся
//начать рисование

static LOGFONT lf; //создаём экземпляр LOGFONT
lf.lfCharSet=DEFAULT_CHARSET; //значение по умолчанию
lf.lfPitchAndFamily=DEFAULT_PITCH; //значения по умолчанию
strcpy(lf.lfFaceName,"Times New Roman"); //копируем в строку название шрифта
lf.lfHeight=20; //высота
lf.lfWidth=10; //ширина
lf.lfWeight=40; //толщина
lf.lfEscapement=0; //шрифт без поворота

HFONT hFont=CreateFontIndirect(&lf); //Cоздали шрифт
SelectObject(hdc, hFont); //Он будет иметь силу только когда мы его выберем
SetTextColor(hdc, RGB(255,0,255)); //зададим цвет текста
SetBkColor(hdc, RGB(0,0,255)); //зададим цвет фона
TextOut(hdc, 100,100, str, strlen(str)); //выведем текст

DeleteObject(hFont); //выгрузим из памяти объект шрифта
EndPaint(hWnd, &ps); //закончили рисование
break;
}


КАК поменять цвет текста?

Функция SetTextColor - задаёт цвет шрифта. Пример:

SetTextColor(hdc, RGB(255,0,255)); //второй параметр задаёт цвет


КАК убрать белый фон за текстом?

Если мы поменяем цвет окна, а сделать это можно, например, при его создании:

w.hbrBackground = CreateSolidBrush(RGB(0,0,100));


Или с помощью функции:

SetBkColor(hdc, RGB(r,g,b))
,

то за текстом в окне фон останется белым. Также, если мы захотим вывести текст в диалоговое окно, нас тоже ждёт сей неприятный сюрприз. Чтобы этого избежать, всего лишь надо изменить режим отображения текста на "прозрачный". Этим занимается функция SetBkMode():

SetBkMode(hdc, TRANPARENT);


Windows также позволяет создать шрифт самому, указав все его параметры до мелочей - наклон в градусах, высоту каждой палочки. Кроме того, можно вращать текст на любой угол. Этим мы и займёмся в следующем разделе!

КАК развернуть текст?

Иногда бывает надо развернуть текст. Согласен, это требуется не так часто, но, например, при выводе графика функции, нужно подписать оси ординат снизу вверх. Структура XFORM задаёт все необходимые парметры поворота. Заполняет контекст функция SetWorldTransform(), передавая, как параметр, ссылку на XFORM HDC.

XFORM xform; //создаём экземпляр структуры XFORM

xform.eM11=(FLOAT) 1.0; //масштаб по х ;
xform.eM22=(FLOAT)1.0; //масштаб по у
xform.eM21=(FLOAT)2.0; //наклон по х
xform.eM12=(FLOAT)1.0; //наклон по у
xform.eDx=(FLOAT)1.0; //смещение по х
xform.eDy=(FLOAT)1.0; //смещение по y

SetWorldTransform (hdc, &xform);


Примечание! Тип данных FLOAT есть только в Windows NT.


Назад Главная Вперёд