лекции / Shchupak_Yu._Win32_API_Razrabotka_prilozheniy_dlya_Windows
.pdfОтображение текста |
|
|
131 |
|
|
|
|
|
|
|
|
|
|
|
Группа |
Ôëàã |
Êîä |
Описание |
|
|
|
|
|
|
Выравнивание |
TA_LEFT |
0x00 |
Опорная точка задает левую границу |
|
по горизонтали |
|
|
обрамляющего прямоугольника |
|
|
|
TA_RIGHT |
0x02 |
Опорная точка задает правую границу |
|
|
|
|
обрамляющего прямоугольника |
|
|
TA_CENTER |
0x06 |
Горизонтальный центр обрамляющего |
|
|
|
|
прямоугольника совмещается с опорной |
|
|
|
|
точкой |
Выравнивание |
TA_TOP |
0x00 |
Опорная точка задает верхнюю границу |
|
по вертикали |
|
|
обрамляющего прямоугольника |
|
|
|
TA_BOTTOM |
0x08 |
Опорная точка задает нижнюю границу |
|
|
|
|
обрамляющего прямоугольника |
|
|
TA_BASELINE |
0x18 |
Базовая линия текста совмещается |
|
|
|
|
с опорной точкой |
Направление |
TA_RTLREADING |
0x100 |
Текст выводится справа налево (применяет- |
|
вывода текста |
|
|
ся только для арабского языка или иврита) |
|
|
|
|
|
|
Пример использования функции TextOut можно найти в листинге 2.1, а также в некоторых других фрагментах программного кода.
Вывод текста с табуляцией
К сожалению, функция TextOut не обрабатывает управляющие символы, в том чис ле символы перевода строки \n и табуляции \t. Встретив любой такой символ, она просто выведет глиф (для системного шрифта SYSTEM_FONT) или глиф для несистемного шрифта.
В то же время табуляция широко используется в простейших текстовых ре дакторах для выравнивания текста по столбцам, облегчающего восприятие ин формации. Для обеспечения работы с табулированным текстом Windows содер жит функции TabbedTextOut и GetTabbedTextExtent.
Функция TabbedTextOut имеет следующий прототип:
LONG TabbedTextOut(HDC hDC, int X, int Y, LPCTSTR lpString, int nCount, int iNumTabs, CONST LPINT lpnTabStops, int xTabOrigin);
Первые пять параметров имеют то же значение, что и у функции TextOut. Шес той параметр, iNumTabs, определяет количество позиций табуляции. Седьмой па раметр, lpnTabStops, содержит указатель на массив позиций табуляции, заданных в логических единицах. Позиции табуляции должны быть отсортированы в воз растающем порядке.
Если шестой параметр равен нулю и одновременно седьмой параметр равен NULL, то позиции табуляции устанавливаются через одинаковые промежутки, равные восьмикратной средней ширине символов. Если шестой параметр равен единице, то первый элемент массива lpnTabStops содержит число символьных позиций, кото рое каждый раз прибавляется для определения следующей позиции табуляции.
Последний параметр, xTabOrigin, задает логическую координату по горизонтали точки отсчета позиций табуляции. Часто бывает удобно определить эту точку так, чтобы она совпадала с начальной позицией вывода строки, поскольку в этом случае массив lpnTabStops перестает быть зависимым от конкретной позиции вывода.
Если выводимая строка содержит символы табуляции \t, то GDI отображает начало строки, пока не обнаружит символ табуляции. После этого GDI просмат ривает массив позиций табуляций, и если первая позиция подходит для продол
132 |
Глава 2. GDI — графический интерфейс устройства |
|
|
жения вывода (то есть она находится правее границы последнего выведенного символа строки), то вывод продолжается с этой позиции. В противном случае GDI берет следующую позицию из массива и проверяет ее и т. д. То же самое происхо дит при обнаружении следующего символа табуляции. Таким образом, функция не гарантирует, что символы после n го символа табуляции будут выводиться в n й позиции табуляции.
Позиции табуляции в массиве lpnTabStops могут быть отрицательными. В этом случае GDI использует абсолютное значение указанной величины, но выравни вает текст по правому краю перед заданной позицией, вместо выравнивания по левому краю после нее.
В случае успешного завершения функция TabbedTextOut возвращает 32 разрядное число, старшее слово которого содержит высоту, а младшее — ширину выведенной строки. В случае неудачного завершения работы возвращается нулевое значение.
Функция GetTabbedTextExtent возвращает размеры табулированного текста, не выводя его.
Следующий фрагмент кода показывает пример использования функции TabbedTextOut. Оконная процедура, код которой приводится ниже, обеспечива ет вывод на экран небольшой таблицы:
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC; |
|
|
PAINTSTRUCT ps; |
|
|
int tabstop[] = { -130, 150, 250 }; |
|
|
int i; |
|
|
const char* lines[] = { |
|
|
"Group""\t" "Result" |
"\t" "Function" |
"\t" "Parameters", |
"Font" "\t" "HFONT" |
"\t" "CreateFont" |
"\t" "(int nHeight, ...)", |
"Text" "\t" "COLORREF""\t" "SetTextColor""\t" "(HDC hdc, ...)", |
||
"Text" "\t" "BOOL" |
"\t" "TextOut" |
"\t" "(HDC hdc, ...)" |
}; |
|
|
int x = 50, y = 50; |
|
|
switch (uMsg)
{
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
for (i = 0; i < 4; i++) { if (i == 1) y += 10;
y += HIWORD(TabbedTextOut(hDC, x, y, lines[i], strlen(lines[i]), sizeof(tabstop)/sizeof(int), tabstop, x));
}
EndPaint(hWnd, &ps); break;
case WM_DESTROY: PostQuitMessage(0); break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
Отображение текста |
133 |
|
|
|
|
Таблица формируется в цикле for. Обратите внимание на то, что значение, воз вращаемое функцией TabbedTextOut, мы используем для вычисления смещения, что бы получить координату y следующей строки выводимого текста. Последнему па раметру функции передается то же значение x, которое задает абсциссу начала вывода строки. Поэтому, определяя абсолютные значения позиций табуляции, GDI прибавляет к величинам, извлекаемым из массива tabstop, величину x. Результат работы этого кода показан на рис.2.28.
Заметим, что горизонтальная линейка, показывающая физические координаты по горизонтали, нарисована соответствующими вызовами функций MoveToEx, LineTo и TextOut. Чтобы не загромождать пример, эти инструкции в программе не пока заны. Обратите внимание на выравнивание по правому краю второго столбца таб лицы относительно позиции 180, вычисленной в результате сложения 50 + 130.
Рис. 2.28. Вывод табулированного текста
Межсимвольные интервалы
В контексте устройства имеется специальный атрибут, управляющий расстоя нием между символами, — межсимвольный интервал (extra space). Межсимволь ный интервал добавляется к каждому символу, включая символы пробела, ког да GDI выводит строку текста. По умолчанию этот атрибут равен нулю. Функция SetTextCharacterExtra присваивает ему новое целочисленное значение в логичес ких единицах, возвращая предыдущее значение. Функция GetTextCharacterExtra возвращает текущее значение межсимвольного интервала.
Межсимвольные интервалы могут использоваться как для разрядки, так и для уплотнения текста. Чтобы почувствовать, какие возможности дает функ ция SetTextCharacterExtra, модифицируйте предыдущую программу следующим образом. Фрагмент с циклом for надо заменить таким кодом:
SetTextCharacterExtra(hDC, 4); for (i = 0; i < 4; i++) {
if (i == 1) { y += 10;
SetTextCharacterExtra(hDC, 0);
}
y += HIWORD(TabbedTextOut(hDC, x, y, lines[i], strlen(lines[i]), sizeof(tabstop)/sizeof(int), tabstop, x));
}
После этого запустите программу и посмотрите, как изменится отображение текста на экране.
Выравнивание по ширине (выключка1)
Функция TextOut обеспечивает выравнивание текста по левому или правому краю, а также по центру. Вид выравнивания зависит от текущего режима выравнива
1Типографский термин, означающий увеличение межсловных интервалов в строке для выравнива ния по ширине.
134 |
Глава 2. GDI — графический интерфейс устройства |
|
|
ния. Но при этом функция не поддерживает выравнивание по ширине (выключ ку). Выравнивание по ширине означает, что левый край текста должен быть вы ровнен по левой границе области, а правый край — по правой границе. Это дости гается равномерным увеличением протяженности пробелов, разделяющих слова в строке.
Для решения указанной проблемы GDI позволяет использовать функции
GetTextExtentPoint32 и SetTextJustification.
Допустим, что надо реализовать выключку при выводе строк текста в область с левой границей x и правой границей x + width. Предполагается, что протяжен ность строк не превышает width логических единиц. План решения обычно содер жит следующие шаги:
1. С помощью инструкций
SIZE size;
GetTextExtentPoint32(hDC, lpString, nCount, &size);
получить размеры обрамляющего прямоугольника для строки lpString, содер жащей nCount символов. Эти размеры возвращаются в виде значений полей параметра size. Поле size.cx будет содержать ширину обрамляющего прямоу гольника, а поле size.cy — высоту обрамляющего прямоугольника.
2.Подсчитать количество разделительных символов nBreak в строке lpString. Раз делительным символом обычно является пробел, но он может быть переопреде лен в каком либо шрифте на другой символ. Если нужно уточнить, какой сим вол на самом деле является разделительным, используйте функцию GetTextMetrics с последующим анализом поля tmBreakChar структуры TEXTMETRIC.
3.Вычислить размер пространства, которое необходимо распределить между nBreak разделительными символами:
int breakExtra = width - size.cx;
4. Вызвать функцию
SetTextJustification(hdc, breakExtra, nBreak);
передав ей определенные выше величины breakExtra и nBreak. Функция SetTextJustification присвоит атрибуту контекста устройства, отвечающему за выключ ку текста, величину дополнительного интервала, используемую после этого функциями TextOut и ExtTextOut.
5.Позаботиться о том, чтобы текущий режим выравнивания текста содержал флаг TA_LEFT (значение по умолчанию). После этого уже можно вызвать функцию TextOut для отображения строки текста.
Следует отметить, что при каждом вызове функции SetTextJustification накап ливается погрешность, если величина breakExtra не делится нацело на nBreak. Что бы эта погрешность не повлияла на последующую работу функции GetTextExtentPoint32 при выводе многострочного текста, рекомендуется перед обращением к GetTextExtentPoint32 сбросить накопленную погрешность вызовом функции
SetTextJustification(hdc, 0, 0);
В листинге 2.1 приводится программа, в которой демонстрируется описанная технология выравнивания текста по ширине.
Отображение текста |
135 |
|
|
|
|
Листинг 2.1. Проект TextJust
//////////////////////////////////////////////////////////////////////
// TextJust.cpp #include <windows.h> #include "KWnd.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL TextJustOut(HDC hdc, int x, int y, LPCTSTR lpStr, int width, char breakChar = ' ');
//////////////////////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
KWnd mainWnd("Text Justification", hInstance, nCmdShow, WndProc);
while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg);
}
return msg.wParam;
}
//////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hDC; PAINTSTRUCT ps;
char* text[6] =
{"Рассуждай", "Рассуждай токмо",
"Рассуждай токмо о том",
"Рассуждай токмо о том, о чем понятия", "Рассуждай токмо о том, о чем понятия твои тебе",
"Рассуждай токмо о том, о чем понятия твои тебе сие дозволяют."
};
int x = 20, y = 20; SIZE size;
int nWidth, i;
switch (uMsg)
{
case WM_PAINT:
hDC = BeginPaint(hWnd, &ps);
GetTextExtentPoint32(hDC, text[5], strlen(text[5]), &size); nWidth = size.cx;
for (i = 0; i < 6; i++) {
TextJustOut(hDC, x, y, text[i], nWidth); y += size.cy + 2;
}
EndPaint(hWnd, &ps);
продолжение
136 |
Глава 2. GDI — графический интерфейс устройства |
|
|
Листинг 2.1 (продолжение)
break;
case WM_DESTROY: PostQuitMessage(0); break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
//////////////////////////////////////////////////////////////////////
BOOL TextJustOut(HDC hdc, int x, int y, LPCTSTR lpStr, int width, TCHAR breakChar)
{
SIZE size;
int nCount = strlen(lpStr);
SetTextJustification(hdc, 0, 0);
GetTextExtentPoint32(hdc, lpStr, nCount, &size);
int nBreak = 0;
for (int i = 0; i < nCount; ++i) if (lpStr[i] == breakChar)
nBreak++;
int breakExtra = width - size.cx; if (breakExtra < 0) breakExtra = 0;
SetTextJustification(hdc, breakExtra, nBreak); return TextOut(hdc, x, y, lpStr, nCount);
}
//////////////////////////////////////////////////////////////////////
В проекте используется класс KWnd, поэтому не забудьте скопировать в каталог проекта файлы KWnd.h и KWnd.cpp, код которых приведен в листинге 1.2, и подклю чить их в состав проекта при помощи окна Project Workspace интегрированной среды.
Код, отвечающий за выравнивание по ширине, инкапсулирован в функцию TextJustOut. В оконной процедуре функция TextJustOut вызывается, чтобы вывести шесть строк из массива text. Ширина области вывода nWidth определяется по самой длинной строке с адресом text[5]. Результат работы программы показан на рис. 2.29.
Рис. 2.29. Выравнивание текста по ширине
Абзацное форматирование в прямоугольнике
В пользовательском интерфейсе Windows часто требуется вывести длинный текст в прямоугольнике, способном вместить несколько строк. Или, напротив, короткий текст поместить в прямоугольнике с учетом заданного позиционирования. Для ре шения подобных проблем Win32 GDI предоставляет функции DrawText и DrawTextEx.
Отображение текста |
|
137 |
|
|
|
||
|
Функция DrawText имеет следующий прототип: |
||
|
int DrawText( |
|
|
|
HDC hDC, |
// |
дескриптор контекста устройства |
|
LPCTSTR lpString, |
// указатель на текстовую строку |
|
|
int nCount, |
// |
длина текста |
|
LPRECT lpRect, |
// прямоугольник, в котором размещается текст |
|
|
UINT uFormat |
// |
флаги форматирования |
); |
|
|
|
Так же как и другие функции вывода текста, функция DrawText принимает в ка честве параметров указатель на символьную строку и длину строки. Однако функ ция ведет себя более интеллектуально по отношению к строкам с завершающим нулевым символом. Вы можете передать значение –1 на месте параметра nCount, и функция сама определит длину строки. Если же строка не имеет завершающего нулевого символа, то благоразумнее будет указать ее длину в аргументе nCount.
Функция DrawText выводит текстовую строку в прямоугольной области, задан ной параметром lpRect. Последний параметр, uFormat, определяет метод формати рования текста. Его значение представляет собой битовую маску, образованную объединением флагов форматирования. Наиболее часто употребляемые флаги приведены в табл. 2.31 (полный перечень флагов см. в MSDN).
Таблица 2.31. Флаги форматирования для функции DrawText
Ôëàã |
Êîä |
Описание |
|
|
|
DT_LEFT |
0x0000 |
Выравнивание текста влево |
DT_CENTER |
0x0001 |
Центрирование по горизонтали |
DT_RIGHT |
0x0002 |
Выравнивание текста вправо |
DT_TOP |
0x0000 |
Начало размещения — в верхней части прямоугольника |
DT_VCENTER |
0x0004 |
Центрирование по вертикали (используется только вместе |
|
|
ñ DT_SINGLELINE) |
DT_BOTTOM |
0x0008 |
Размещение внизу прямоугольника (используется только |
|
|
вместе с DT_SINGLELINE) |
DT_WORDBREAK |
0x0010 |
Перенос текста на следующую строку после окончания |
|
|
очередного слова, если оставшаяся часть текста не помеща- |
|
|
ется по ширине прямоугольника вывода. Флаг работает, только |
|
|
если не указан флаг DT_SINGLELINE |
DT_SINGLELINE |
0x0020 |
Вывод текста только в одну строку. Символы возврата каретки |
|
|
и перевода строки не воспринимаются как управляющие сим- |
|
|
волы (выводятся как • или ) |
DT_EXPANDTABS |
0x0040 |
Интерпретация символов \t как управляющих символов, зада- |
|
|
ющих табуляцию. По умолчанию шаг табуляции равен восьми- |
|
|
кратной средней ширине символов |
DT_NOPREFIX |
0x0800 |
Отменяет обработку префиксов &. Обычно DrawText интерпре- |
|
|
тирует префикс & как директиву «подчеркнуть следующий |
|
|
за префиксом символ», а последовательность && – как дирек- |
|
|
тиву вывести одиночный символ &. С флагом DT_NOPREFIX |
|
|
символ & воспринимается наравне с другими символами, а не |
|
|
как префикс |
DT_PATH_ELLIPSIS |
0x4000 |
Если строка не помещается по ширине прямоугольника, часть |
|
|
символов в середине строки замещается многоточием |
|
|
(используется только вместе с DT_SINGLELINE) |
DT_END_ELLIPSIS |
0x8000 |
Если строка не помещается по ширине прямоугольника, часть |
|
|
символов в конце строки замещается многоточием (исполь- |
|
|
зуется только вместе с DT_SINGLELINE) |
|
|
|
138 |
Глава 2. GDI — графический интерфейс устройства |
|
|
Если параметр uFormat имеет нулевое значение, то Windows интерпретирует текст как ряд строк, разделенных символами возврата каретки (‘\r’ или 0x0D) или символами конца строки (‘\n’ или 0x0A). Вывод текста производится, начиная с верхнего левого угла прямоугольника. Возврат каретки или конец строки вос принимаются как команда перейти на новую строку. Вывод новой строки начина ется под предыдущей строкой с интервалом, равным высоте символа в строке.
Любой текст, в том числе и части букв, попадающие при выводе правее или ниже границ прямоугольника, отсекаются. Можно предотвратить потерю текста от отсечения по правой границе, задав флаг DT_WORDBREAK.
Если выводится короткий текст, то рекомендуется указывать флаг DT_ SINGLELINE. Это позволяет использовать все флаги позиционирования текста в прямоугольнике.
В случае успешного завершения функция DrawText обычно возвращает высоту выведенного текста. Для многострочного текста возвращается суммарная высота всех строк. Исключение составляют случаи использования функции с флагом DT_VCENTER или DT_BOTTOM. В этих двух случаях функция возвращает смещение нижней границы текста относительно верхней границы прямоугольника.
Если функция по каким либо причинам не смогла нормально выполнить свою работу, то возвращается нулевое значение.
Покажем примеры использования функции DrawText. На рис. 2.30 приведен результат трехкратного вызова функции
DrawText(hDC, text1, -1, &rect, uFormat);
для вывода строки
char text1[] = "&Open C:\\WINNT\\system32\\gdi32.dll";
со следующими значениями параметра uFormat: а) 0;
б) DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOPREFIX;
в) DT_SINGLELINE | DT_RIGHT | DT_BOTTOM.
Прямоугольник rect отображен на рисунке дополнительным вызовом функ ции Rectangle.
Рис. 2.30. Вывод строки text1 с разным позиционированием в прямоугольнике rect
На рис. 2.31 демонстрируется вывод этого же текста в более узком прямо угольнике, который не может уместить весь текст. Трем вызовам функции соот ветствуют значения параметра uFormat:
а) 0;
б) DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS;
в) DT_SINGLELINE | DT_BOTTOM | DT_PATH_ELLIPSIS.
Обратите внимание на то, что при первом вызове функции DrawText конец стро ки отсекается, при втором — хвостовой фрагмент строки заменяется многоточием, при третьем — замена многоточием осуществляется в средней части, чтобы пока зать завершающую часть строки.
Отображение текста |
139 |
|
|
|
|
На рис. 2.32 показан результат вызова функции
DrawText(hDC, text2, -1, &rect, DT_SINGLELINE | DT_VCENTER | DT_EXPANDTABS);
для вывода строки
char text2[] = "&Open \tC:\\WINNT\\system32\\gdi32.dll";
содержащей символ табуляции ‘\t’.
Рис. 2.31. Вывод строки text1 в прямоугольнике, имеющем недостаточную ширину для размещения текста
Рис. 2.32. Вывод строки text2, содержащей символ табуляции
На рис. 2.33 приведен вывод текста
char text3[] = "Warning: this computer program \n is protected by copyright law \n and international treaties";
в результате вызова функции
DrawText(hDC, text3, -1, &rect, DT_CENTER);
Рис. 2.33. Вывод текста, содержащего символы конца строки (\n), с флагом DT_CENTER
Наконец, аналогичный текст, но не содержащий символов конца строки
char text4[] = "Warning: this computer program is protected by copyright law and international treaties";
выводится с помощью вызова
DrawText(hDC, text4, -1, &rect, DT_WORDBREAK);
так, как это показано на рис. 2.34.
Рис. 2.34. Преобразование однострочного текста в многострочный при помощи флага DT_WORDBREAK
Функция DrawTextEx имеет следующий прототип:
int DrawTextEx(HDC hDC, LPTSTR lpchTExt, int cchText, LPRECT lpRect, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams);
Она отличается от DrawText наличием дополнительного параметра, который содержит указатель на структуру DRAWTEXTPARAMS. Эта структура определяет рас стояния между позициями табуляции, левые и правые поля для вывода текста,
140 |
Глава 2. GDI — графический интерфейс устройства |
|
|
а также используется для возвращения длины выведенной строки. Более подроб ная информация об этой функции приведена в MSDN.
Функция ExtTextOut
Функция ExtTextOut, представляющая собой расширенную версию функции TextOut, имеет следующий прототип:
BOOL ExtTextOut(HDC hdc, int X, int Y, UINT fuOptions, CONST RECT* lprc, LPCTSTR lpString, UINT cbCount, CONST INT* lpDx);
Параметры hdc, X, Y, lpString, cbCount имеют тот же смысл, что и аналогичные параметры функции TextOut. Поэтому следующий вызов:
ExtTextOut(hDC, x, y, 0, NULL, lpString, cbCount, NULL);
эквивалентен вызову функции
TextOut(hDC, x, y, lpString, cbCount);
Остается рассмотреть три новых параметра. Параметр fuOptions содержит на бор флагов, которые управляют интерпретацией других параметров. Необязатель ный параметр1 lprc указывает на прямоугольник, который исполняет роль прямо угольника отсечения, или прямоугольника фона для выводимого текста, или того и другого вместе. Необязательный параметр lpDx содержит указатель на массив расстояний между ячейками символов. В табл. 2.32 перечислены допустимые зна чения флагов, которые могут объединяться в битовую маску, используемую в ка честве значения параметра fuOptions.
Таблица 2.32. Флаги функции ExtTextOut
Ôëàã |
Êîä |
Описание |
|
|
|
ETO_OPAQUE |
0x0002 |
Перед выводом текста прямоугольник lprc закрашивается |
|
|
цветом фона графических элементов |
ETO_CLIPPED |
0x0004 |
Текст отсекается по прямоугольнику lprc |
ETO_GLYPH_INDEX |
0x0010 |
Параметр lpString указывает на массив индексов глифов |
|
|
(вместо кодов символов), который можно получить вызовом |
|
|
функции GetCharacterPlacement. Индексы глифов всегда |
|
|
являются 16-разрядными величинами |
ETO_RTLREADING |
0x0080 |
Для шрифтов арабского языка и иврита текст выводится |
|
|
справа налево |
ETO_NUMERICSLOCAL |
0x0400 |
Числа выводятся символами национальных алфавитов |
ETO_NUMERICSLATIN |
0x0800 |
Числа выводятся арабскими цифрами |
ETO_IGNORELANGUAGE |
0x1000 |
Не выполнять дополнительную языковую обработку |
ETO_PDY |
0x2000 |
Параметр lpDx указывает на массив пар, в которых первое |
|
|
число определяет шаг по горизонтали между двумя смеж- |
|
|
ными ячейками символов, а второе — относительное сме- |
|
|
щение этих ячеек по вертикали |
|
|
|
Одним из возможных применений функции ExtTextOut является вывод текста в ячейки некоторой таблицы. Если вы хотите заполнить фон ячеек таблицы цве том фона графических элементов, который используется при выводе текста, то можно передать прямоугольник ячейки функции ExtTextOut и установить флаги
ETO_OPAQUE и ETO_CLIPPED.
1 Может иметь значение NULL.
