Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции / Shchupak_Yu._Win32_API_Razrabotka_prilozheniy_dlya_Windows

.pdf
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
13.15 Mб
Скачать

Отображение текста

121

 

 

 

Внедрение шрифтов должно соответствовать лицензионным правилам исполь зования шрифтов. Для определения лицензионного статуса шрифтов TrueType/ OpenType следует вызвать функцию GetOutlineTextMetrics и затем проверить зна чение поля otmfsType структуры OUTLINETEXTMETRIC.

Метрики шрифтов

При форматировании текста Win32 GDI использует метрики шрифта, которые поясняются на рис. 2.27.

Рис. 2.27. Метрики шрифта

Отсчет всех размеров выполняется от так называемой базовой линии шрифта. На ней находится нижняя граница глифов большинства прописных букв. Все сим волы шрифта размещаются в прямоугольных ячейках.

Высота шрифта tmHeight складывается из надстрочного интервала и подстроч ного интервала.

Надстрочный интервал tmAscent — это расстояние от базовой линии до верх ней границы ячейки символа.

Подстрочный интервал tmDescent — это расстояние от базовой линии до ниж ней границы ячейки символа.

Внутренний зазор tmInternalLeading определяет пространство для размещения диакритических знаков, таких как знак акцента или умляут.

Внешний зазор tmExternalLeading определяет минимальный интервал между со седними строками для многострочного текста.

Вполиграфии размер шрифта измеряется в пунктах. Один пункт равен 0,01389 дюйма (1/71,99424). В компьютерной верстке пункт округляется до 1/72 дюйма. Еще один типографский термин «кегль» определяется как разность высоты шриф та и внутреннего зазора.

Для получения информации о шрифте, выбранном в контекст устройства, пред назначена функция GetTextMetrics:

BOOL GetTextMetrics(HDC hdc, LPTEXTMETRIC lptm);

Возвращаемая функцией информация размещается в структуре типа TEXTMETRIC с адресом lptm. Структура TEXTMETRIC имеет следующее определение:

typedef struct tagTEXTMETRIC

{

LONG tmHeight;

// высота символов

LONG tmAscent;

// надстрочный интервал

LONG tmDescent;

// подстрочный интервал

LONG tmInternalLeading;

// внутренний зазор

продолжение

122

Глава 2. GDI — графический интерфейс устройства

 

 

LONG tmExternalLeading;

// внешний зазор

LONG tmAveCharWidth;

// средняя ширина символов

LONG tmMaxCharWidth;

// максимальная ширина символов

LONG tmWeight;

// вес (насыщенность) шрифта

LONG tmOverhang;

// дополнительный промежуток для синтеза

 

//некоторых шрифтов

LONG tmDigitizedAspectX; // горизонтальный аспект устройства

LONG tmDigitizedAspectY; // вертикальный аспект устройства

TCHAR tmFirstChar;

// первый символ, для которого в шрифте имеется

 

//ãëèô

TCHAR tmLastChar;

// последний символ, для которого имеется глиф

TCHAR tmDefaultChar;

// символ для замены символов, не имеющих глифа

TCHAR tmBreakChar;

// символ для вставки в промежутки слов при

 

//выравнивании текста

BYTE tmItalic;

// признак курсива

BYTE tmUnderlined;

// признак подчеркивания

BYTE tmStruckOut;

// признак перечеркивания

BYTE tmPitchAndFamily;

// шаг, технология и семейство шрифта

BYTE tmCharSet;

// набор символов

} TEXTMETRIC;

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

Поле tmWeight определяет вес (жирность) шрифта. Эта величина может изме няться от 0 до 1000, но чаще всего она равна или 400 для нормального начертания шрифта, или 700 для полужирного начертания.

Вполе tmOverhang содержится величина, на которую увеличивается ширина символов для синтезированных шрифтов, например для наклонных или жирных шрифтов, получаемых из нормального шрифта. Шрифты TrueType обычно не ис пользуют это поле, так как в них для каждого начертания создается свой шрифт.

Поля tmDigitizedAspectX и tmDigitizedAspectY прокомментированы в MSDN тер минами горизонтальный аспект устройства (horizontal aspect of the device) и вер тикальный аспект устройства (vertical aspect of the device) соответственно, для которых был создан текущий шрифт. По существу, они содержат те же значения, которые возвращает функция GetDeviceCaps с аргументами LOGPIXELSX и LOGPIXELSY, то есть «число пикселов на 1 логический дюйм по горизонтали» и «число пиксе лов на 1 логический дюйм по вертикали». При синтезе шрифтов имеют значение не абсолютные значения этих величин, а их соотношение tmDigitizedAspectY / tmDigitizedAspectX, называемое аспектным соотношением (aspect ratio).

Поле tmDefaultChar имеет довольно простой смысл. Если приложение пытает ся вывести неотображаемый символ, код которого отсутствует в шрифте, то вме сто него будет выведен символ с кодом, содержащимся в поле tmDefaultChar. На рис. 2.22–2.25 показано, что Windows выводит в таких случаях контурный пря моугольник.

Поле tmBreakChar обычно содержит код пробела (0x20).

Вполе tmPitchAndFamily содержится информация о шаге, технологии и семей стве шрифта. Четыре младших бита указывают на шаг и технологию. Соответ ствующие константы приведены в табл. 2.22.

Четыре старших бита обозначают семейство шрифта. Возможные значения

ввиде констант Windows были приведены в табл. 2.21.

Отображение текста

 

123

 

 

 

Таблица 2.22. Шаг и технология шрифта

 

 

 

 

Константа

Êîä

Описание

 

 

 

 

 

TMPF_FIXED_PITCH

0x01

Если этот бит установлен, шрифт является пропорциональным,

 

 

 

в противном случае — моноширинным. Обратите внимание на то,

 

 

 

что трактовка значения бита противоположна имени константы

 

TMPF_VECTOR

0x02

Если этот бит установлен, шрифт — векторный

 

TMPF_TRUETYPE

0x04

Если этот бит установлен, используется шрифт True Type

 

TMPF_DEVICE

0x08

Если этот бит установлен, используется шрифт устройства

 

 

 

 

В поле tmCharSet находится код используемого набора символов. Возможным значениям кода сопоставлены константы, определенные в файле wingdi.h. Неко торые из них показаны в табл. 2.23.

Таблица 2.23. Коды наборов символов

Константа

Êîä

Примечание

 

 

 

ANSI_CHARSET

0

 

DEFAULT_CHARSET

1

 

SYMBOL_CHARSET

2

 

SHIFTJIS_CHARSET

128

 

HANGUL_CHARSET

129

 

GB2312_CHARSET

134

 

CHINESEBIG5_CHARSET

136

 

GREEK_CHARSET

161

Только для Windows NT/2000

TURKISH_CHARSET

162

Только для Windows NT/2000

HEBREW_CHARSET

177

Только для Windows NT/2000

ARABIC_CHARSET

178

Только для Windows NT/2000

RUSSIAN_CHARSET

204

Только для Windows NT/2000

EASTEUROPE_CHARSET

238

Только для Windows NT/2000

OEM_CHARSET

255

 

 

 

 

Чтобы использовать функцию GetTextMetrics, сначала нужно определить струк турную переменную типа TEXTMETRIC, например:

TEXTMETRIC tm ;

Затем необходимо получить дескриптор контекста устройства и вызвать функ цию GetTextMetrics:

hDC = GetDC(hWnd) ; GetTextMetrics(hDC, &tm) ;

После этого метрики текущего шрифта будут находиться в соответствующих полях переменной tm. В завершение не забудьте освободить контекст устройства:

ReleaseDC(hWnd, hDC) ;

Приведем пример. Допустим, что текущее разрешение экрана составляет 96 dpi1, а в приложении используются: а) шрифт с гарнитурой «Arial», нормальным начер танием и высотой 18 логических единиц; б) режим отображения MM_TEXT, в кото ром логические единицы совпадают с физическими единицами, то есть пикселами.

1 dpi — dot per inch (число точек на дюйм).

124

Глава 2. GDI — графический интерфейс устройства

 

 

Тогда после вызова функции GetTextMetrics поля переменной tm будут заполнены следующими значениями:

{18, 15, 3, 2, 1, 7, 43, 400, 0, 96, 96, 30, 255, 31, 32, 0, 0, 0, 39, 204}

Обратите внимание на то, что интерпретация поля tmPitchAndFamily связана с его побитовой кодировкой, поэтому десятичное значение 39 стоит преобразо вать к шестнадцатеричному коду 0x27.

Логические шрифты

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

Логический шрифт представляет собой объект GDI, описывающий требования к шрифту со стороны приложения. GDI анализирует запрошенные параметры и под бирает наиболее подходящий шрифт из тех, которые зарегистрированы в системе.

Объект логического шрифта находится под управлением GDI вместе с други ми логическими объектами. Приложения работают с логическими шрифтами толь ко через их дескрипторы, имеющие тип HFONT.

Стандартные шрифты

По умолчанию в контексте устройства выбран системный шрифт SYSTEM_FONT, основным и почти единственным преимуществом которого является то, что он всегда доступен для использования. Системный шрифт является растровым, со держит буквы переменной ширины, не имеющие засечек, и для него используется кодировка ANSI.

Однако в некоторых случаях может понадобиться шрифт с фиксированной ши риной букв или шрифт в кодировке OEM1. Вы можете получить дескриптор од ного из стандартных (встроенных) шрифтов при помощи функции GetStockObject, передав в качестве аргумента одно из значений, указанных в табл. 2.24.

Таблица 2.24. Идентификаторы встроенных шрифтов

Идентификатор

Êîä

Описание

 

 

 

OEM_FIXED_FONT

10

Шрифт в кодировке OEM с фиксированной шириной букв

ANSI_FIXED_FONT

11

Шрифт в кодировке ANSI с фиксированной шириной букв

ANSI_VAR_FONT

12

Шрифт в кодировке ANSI с переменной шириной букв

SYSTEM_FONT

13

Системный шрифт в кодировке ANSI с переменной шириной

 

 

букв, используется для отображения текста в меню, в заго-

 

 

ловках окон, в элементах управления диалоговых окон,

 

 

а также в клиентской области окна

DEVICE_DEFAULT_FONT

14

Шрифт, который используется для данного устройства по

 

 

умолчанию

SYSTEM_FIXED_FONT

16

Шрифт в кодировке ANSI с фиксированной шириной букв.

 

 

Использовался как системный шрифт в старых версиях (до

 

 

Windows 3.0)

DEFAULT_GUI_FONT

17

Шрифт по умолчанию для объектов пользовательского

 

 

интерфейса, таких как меню и диалоговые окна (только для

 

 

Windows NT/2000)

 

 

 

1 OEM — Original Equipment Manufacturers

Отображение текста

125

 

 

 

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

Создание логических шрифтов

Область применения стандартных шрифтов обычно ограничивается простым выводом элементов пользовательского интерфейса. Для любых других целей при ходится создавать собственные логические шрифты. В GDI для этого предусмот рены функции CreateFont, CreateFontIndirect и CreateFontIndirectEx.

В этом разделе не будет рассматриваться функция CreateFontIndirectEx, кото рая поддерживает использование шрифтов нового формата OpenType фирмы Microsoft. При необходимости найти нужную информацию можно в MSDN.

Функция CreateFont использует для описания логического шрифта 14 парамет ров, поэтому она не слишком удобна в использовании. Вместо нее лучше пользо ваться функцией CreateFontIndirect. Эта функция получает указатель на структу ру LOGFONT, в которой упакованы эти же 14 параметров. Функция имеет следующий прототип:

HFONT CreateFontIndirect(CONST LOGFONT* lplf);

Структура LOGFONT определена в файле wingdi.h следующим образом:

typedef struct tagLOGFONT

{

int lfHeight; int lfWidth;

int lfEscapement; int lfOrientation; int lfWeight;

BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet;

BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality;

BYTE lfPitchAndFamily;

char lfFaceName[LF_FACESIZE]; } LOGFONT;

Рассмотрим назначение ее полей:

lfHeight — желательная высота шрифта в логических единицах. Поле может иметь положительное, нулевое или отрицательное значение. Положительное значение определяет требуемую высоту ячеек, то есть величину tmHeight на рис. 2.27. Если указано нулевое значение, то выбирается шрифт размером 12 пунктов (значе ние по умолчанию). Абсолютная величина отрицательного значения определя ет высоту символов, то есть расстояние tmHeight – tmInternalLeading.

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

lfEscapement — угол между базовой линией текста и осью X устройства в деся тых долях градуса. Отсчет ведется против часовой стрелки.

126

Глава 2. GDI — графический интерфейс устройства

 

 

lfOrientation — угол между базовой линией каждого символа и осью X устрой ства в десятых долях градуса. Отсчет ведется против часовой стрелки. Если устройство работает в расширенном графическом режиме (GM_ADVANCED), до ступном лишь в Windows NT/2000, то наклон lfEscapement и ориентация lfOrientation задаются независимо друг от друга. В совместимом графическом режиме (GM_COMPATIBLE) поле lfEscapement задает одновременно и наклон, и ориентацию символов. MSDN рекомендует в последнем случае устанавли вать одно и то же значение для полей lfEscapement и lfOrientation.

lfWeight — желательный вес (жирность) шрифта в интервале от 0 до 1000. На пример, значение 400 создает нормальный шрифт, а 700 — полужирный шрифт. В табл. 2.25 приведены константы, которые можно использовать для установ ки данного поля. Значение FW_DONTCARE предписывает выбрать вес шрифта по умолчанию.

Таблица 2.25. Константы для определения веса шрифта1

Константа Значение

FW_DONTCARE 0

FW_THIN 100

FW_EXTRALIGHT 200

FW_ULTRALIGHT 200

FW_LIGHT 300

FW_NORMAL 400

FW_REGULAR 400

FW_MEDIUM 500

FW_SEMIBOLD 600

FW_DEMIBOLD 600

FW_BOLD 700

FW_EXTRABOLD 800

FW_ULTRABOLD 800

FW_HEAVY 900

FW_BLACK 900

lfItalic — запрашивается курсивный шрифт, если значение поля равно TRUE.

lfUnderline — запрашивается шрифт с подчеркиванием букв.

lfStrikeOut — запрашивается шрифт с перечеркнутыми буквами.

lfCharSet — набор символов шрифта. Вы можете использовать одну из констант, приведенных в табл. 2.23.

lfOutPrecision — требуемая степень соответствия параметров выбираемого шрифта запрашиваемым характеристикам. Это поле указывает GDI критерии выбора между имеющимися в системе шрифтами. Наиболее часто используются значе ния из табл. 2.26.

1 Можно использовать любое из указанных значений, однако следует иметь в виду, что многие шрифты содержат описания символов только для веса FW_NORMAL, FW_REGULAR и FW_BOLD.

Отображение текста

 

127

 

 

 

Таблица 2.26. Константы для поля lfOutPrecision

 

 

 

 

Константа

Êîä

Описание

 

 

 

 

 

OUT_DEFAULT_PRECIS

0

Стандартный способ подбора шрифтов

 

OUT_TT_PRECIS

4

Отдается предпочтение шрифтам True Type

 

OUT_DEVICE_PRECIS

5

Отдается предпочтение шрифтам устройства вывода

 

OUT_RASTER_PRECIS

6

Отдается предпочтение растровым шрифтам

 

OUT_TT_ONLY_PRECIS

7

Используются только шрифты True Type

 

OUT_OUTLINE_PRECIS

8

Отдается предпочтение шрифтам True Type и другим

 

 

 

контурным шрифтам

 

 

 

 

lfClipPrecision — способ отсечения символа, частично попавшего за пределы ре гиона отсечения. Поле может иметь одно или несколько значений из табл. 2.27, объединенных побитовой операцией ИЛИ. Из всех флагов к отсечению, соб ственно, относится только константа CLIP_DEFAULT_PRECIS.

Таблица 2.27. Константы для поля lfClipPrecision

Константа

Êîä

Описание

 

 

 

CLIP_DEFAULT_PRECIS

0

Стандартная процедура отсечения

CLIP_LH_ANGLES

0x10

Если этот флаг установлен, то направление вращения для

 

 

всех шрифтов зависит от ориентации координатной

 

 

системы (левосторонняя или правосторонняя). Если флаг

 

 

не установлен, то шрифты устройств вращаются всегда

 

 

против часовой стрелки, но вращение других шрифтов

 

 

зависит от ориентации координатной системы

CLIP_EMBEDDED

0x80

Запрашивается использование внедренных шрифтов,

 

 

доступных только для чтения

 

 

 

lfQuality — качество вывода глифов. Можно использовать одну из констант, приведенных в табл. 2.28. Для шрифтов TrueType константы DRAFT_QUALITY и PROOF_QUALITY не имеют значения, поскольку контуры глифов свободно мас штабируются до нужной величины.

Таблица 2.28. Константы для поля lfQuality

Константа

Êîä

Описание

 

 

 

DEFAULT_QUALITY

0

Внешний вид символов несущественен

DRAFT_QUALITY

1

Внешний вид символов менее важен по сравнению с

 

 

другими атрибутами шрифта. Для растровых шрифтов это

 

 

позволяет GDI синтезировать разные размеры шрифта,

 

 

но с потерей качества

PROOF_QUALITY

2

Внешний вид символов более важен по сравнению с другими

 

 

атрибутами шрифта, поэтому масштабирование растровых

 

 

шрифтов запрещено

NONANTIALIASED_QUALITY

3

Сглаживание (antialiasing) запрещено

ANTIALIASED_QUALITY

4

Выполнять сглаживание (antialiasing), если оно поддержи-

 

 

вается шрифтом и если размер шрифта не слишком велик

èне слишком мал

lfPitchAndFamily — задает шаг и семейство шрифта. Возможные значения опреде ляются как объединение (логическая операция ИЛИ) одного из значений, при веденных в табл. 2.29, и одного из значений, приведенных в табл. 2.21.

128

 

Глава 2. GDI — графический интерфейс устройства

 

Таблица 2.29. Константы, указывающие шаг шрифта

 

 

 

Константа

Êîä

Описание

 

 

 

DEFAULT_PITCH

0x0

Шаг по умолчанию

FIXED_PITCH

0x1

Моноширинный шрифт

VARIABLE_PITCH

0x2

Пропорциональный шрифт

 

 

 

fFaceName — строка с завершающим нулевым байтом, задающая имя гарниту ры шрифта. Размер строки, включая завершающий нуль, не должен превы шать 32 байта. Имена гарнитур шрифтов, установленных в системе в настоя щий момент, можно получить при помощи функции EnumFontFamiliesEx. Если поле fFaceName содержит пустую строку, то GDI выбирает первый попавшийся шрифт, который удовлетворяет другим заданным атрибутам.

Перед вызовом функции CreateFontIndirect вы должны определить переменную типа HFONT для создаваемого шрифта:

HFONT hFont;

а также переменную типа LOGFONT:

LOGFONT lf;

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

static LOGFONT lf;

так как в этом случае компилятор обеспечит инициализацию всех полей структу ры lf нулевыми значениями.

Если вы проектируете приложение, в котором пользователь должен иметь воз можность выбора используемого шрифта, то для заполнения полей структурной переменной lf следует воспользоваться функцией ChooseFont. Она вызывает стан дартное диалоговое окно для выбора шрифта. Эта возможность будет рассмотре на в главе 7 (раздел «Диалоговые окна общего пользования»).

После того как переменная lf подготовлена, вызовите функцию CreateFontIndirect:

hFont = CreateFontIndirect(&lf);

Полученный дескриптор hFont созданного логического шрифта выберите в кон текст устройства:

HFONT hOldFont = (HFONT)SelectObject(hDC, hFont);

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

DeleteObject(SelectObject(hDC, hOldFont));

Пример работы с логическими шрифтами приведен в листинге 2.3.

Подстановка шрифта

Новый логический шрифт, созданный функцией CreateFont или CreateFontIndirect, не ассоциируется ни с каким физическим шрифтом, пока он не будет выбран в контекст устройства вызовом функции SelectObject. Процесс поиска и выбора нуж ного физического шрифта, реализуемый системой в ходе выполнения функции

SelectObject, называется подстановкой или отображением шрифта (font mapping).

Отображение текста

129

 

 

 

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

Наиболее важным фактором при подборе физического шрифта является набор символов, который задается в поле lfCharSet. При несовпадении этого атрибута очень велика вероятность, что символы будут выводиться совершенно неверными гли фами. Следующее по важности поле — это lfOutPrecision. Этот показатель ограничи вает рассматриваемые наборы символов определенными типами шрифтов. Затем оценивается поле lfFaceName, а после него — поле lfPitchAndFamily. Моноширинные шрифты сильно отличаются по внешнему виду от пропорциональных, поэтому этот атрибут также является важным при подстановке. После сравнения указанных по лей GDI сравнивает высоту символов, заданную в поле lfHeight, а затем поля lfWidth, lfItalic, lfUnderline, lfStrikeOut.

Получение информации о выбранном физическом шрифте

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

Функция GetTextMetrics, позволяющая выполнить эту задачу, уже рассматрива лась ранее.

Но можно использовать и другую функцию, прототип которой приведен ниже:

int GetTextFace(HDC hDC, int nCount, LPTSTR lpFaceName);

Эта функция получает имя гарнитуры физического шрифта. Оно может отли чаться от имени гарнитуры, которое было задано в структуре LOGFONT. Искомое имя в виде строки с завершающим нулевым символом записывается в символь ный буфер с адресом lpFaceName. Длина буфера (количество символов) определя ется параметром nCount. В случае успешного завершения функция возвращает количество символов, скопированных в буфер, включая и завершающий нулевой символ. В случае ошибки возвращается нулевое значение. Функцию GetTextFace можно вызвать, указав на месте третьего параметра значение NULL. В этом случае она просто вернет количество символов в имени гарнитуры.

Функция GetTextCharSet(HDC hDC) возвращает идентификатор набора символов для текущего шрифта, выбранного в контекст устройства.

Есть и другие функции для получения дополнительной информации о теку щей реализации физического шрифта, к которым относятся GetFontLanguageInfo,

GetTextCharSetInfo и GetOutlineTextMetrics. Они используются при нетривиальном форматировании текста, например при непосредственной работе с глифами. Опи сание этих функций вы можете найти в MSDN или в книге [6].

Вывод текста

Win32 GDI обеспечивает полный набор функций для форматирования и рисова ния текста в клиентской области окна или на бумажной странице принтера. Эти функции могут быть разделены на те, которые форматируют текст, подготавли вая его для вывода, и те, которые действительно отображают текст. Форматиру

130

Глава 2. GDI — графический интерфейс устройства

 

 

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

Простой вывод текста

Простейшая функция вывода текстовой строки TextOut имеет следующий про тотип:

BOOL TextOut (

 

HDC hdc,

// дескриптор контекста устройства

int nXStart,

// x-координата стартовой позиции

int nYStart,

// y-координата стартовой позиции

LPCTSTR lpString,

// указатель на символьную строку

int cbString

// число символов в строке

);

 

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

Текущий режим выравнивания текста реализован как атрибут контекста уст ройства, определяющий правила позиционирования текста. Он указывает, что считать опорной точкой (reference point): точку (nXStart, nYStart) или текущую по зицию пера в контексте устройства. Также режим выравнивания определяет, как позиционировать строку текста (обрамляющий прямоугольник) относительно опорной точки и как выводить текст: слева направо или справа налево.

Значение этого атрибута можно изменить при помощи функции SetTextAlign:

UINT SetTextAlign(HDC hdc, UINT fMode);

передавая второму параметру битовую маску, образованную объединением1 фла гов, перечисленных в табл. 2.30. При этом из каждой группы флагов можно ис пользовать только один флаг. Флаги с кодом 0x00 являются значениями по умол чанию.

Таблица 2.30. Флаги выравнивания текста

Группа

Ôëàã

Êîä

Описание

 

 

 

 

Что считать опорной

TA_NOUPDATECP

0x00

В качестве опорной точки использовать

точкой. Обновлять

 

 

точку (nXStart, nYStart). Текущая позиция

или не обновлять

 

 

пера не обновляется после вывода текста

текущую позицию

 

 

 

ïåðà

 

 

 

 

TA_UPDATECP

0x01

В качестве опорной точки использовать

 

 

 

текущую позицию пера. Текущая позиция

 

 

 

пера обновляется после вывода текста

 

 

 

 

1 Поразрядная логическая операция ИЛИ.