Учебное пособие: Вывод текста
если оба они равны 0, то табулятор будет останавливаться через каждых 8 средних ширин символов.
если массив содержит только одно число N (и cTabStops равно 1), то табулятор будет останавливаться через каждые N единиц.
Параметр nTabOrigin указывает x–координату, начиная от которой отсчитываются положения табулятора. Функция возвращает размер выведенной строки.
С введением этой функции пришлось ввести еще одну функцию, которая определяет размеры строки, содержащей символы табуляции:
DWORD GetTabbedTextExtent( hDC, lpsString, wLength, cTabStops, lpnTabPositions );
Однако эта функция не имеет параметра nTabOrigin, поэтому ее результат может отличаться от результата функции TabbedTextOut(...).
Существует специальная функция, осуществляющая вывод строки текста и устанавливающая требуемые промежутки между отдельными символами строки:
BOOL ExtTextOut( hDC, nXStart, nYStart, fuOption, lpRect, lpsString, wLength, lpnDx );
Параметры hDC, nXStart, nYStart, lpsString и wLength используютсятакже, какивфункции TextOut(). Два дополнительных параметра fuOption и lpRect задают прямоугольник, в котором осуществляется вывод текста и метод использования этого прямоугольника.
Если fuOption равно ETO_OPAQUE, то указанный прямоугольник закрашивается текущим цветом фона; если fuOption равно ETO_CLIPPED, то прямоугольник ограничивает область вывода текста. Оба параметра fuOption и lpRect могут быть 0, тогда такой прямоугольник не используется.
Последний параметр lpnDx указывает на массив целых чисел, который содержит расстояния между каждым символом строки и следующим за ним. Если этот параметр NULL, то используются стандартные промежутки.
Функция
int DrawText( hDC, lpszString, wLength, lpRect, fuFormat );
осуществляет вывод текста в указанный прямоугольник, осуществляя простейшие операции форматирования текста. Первые три параметра этой функции аналогичны таким–же параметрам функции TextOut(), за одним исключением: Вы можете указать длину строки равной -1, тогда Windows будет предполагать, что это asciiz строка (оканчивающаяся нулевым байтом) и сам вычислит ее длину.
Два последних параметра определяют прямоугольник, в который Вы хотите осуществить вывод, и правила размещения текста в этом прямоугольнике.
Параметр fuFormat может содержать следующие флаги:
DT_CENTER DT_LEFT DT_RIGHT | задают режим выравнивания текста по горизонтали. |
DT_SINGLELINE | указывает, что текст должен размещаться в одной строке |
DT_VCENTER DT_TOP DT_BOTTOM | используются только с DT_SINGLELINE и указывают размещение строки текста по вертикали. |
DT_WORDBREAK | разрешает переносить (разбивать) слова. |
DT_EXPANDTABS | разрешает распознавать символы табуляции. По умолчанию используются табулятор на каждой 8 позиции. |
DT_TABSTOP | задает шаг табуляции. Старший байт содержит число символов в одном шаге табулятора. |
Все описанные ниже флаги несовместимы с флагом DT_TABSTOP: | |
DT_EXTERNALLEADING | включает в высоту строки пропуск между строк. По умолчанию этого не делается. |
DT_NOCLIP | выполняет вывод игнорируя указанный прямоугольник. Это иногда ускоряет процесс вывода. |
DT_NOPREFIX | исключает обработку префикса & как подчеркивание текущего символа. По умолчанию префикс & обозначает подчеркнутый символ, последовательность && - одиночный &. |
DT_CALCRECT | только вычисляет размер прямоугольника и не осуществляет вывода. Если используется DT_SINGLELINE, то определяется ширина прямоугольника, а если текст многострочный, то вычисляется высота, достаточная для размещения заданного текста при фиксированной ширине. |
Последняя рассматриваемая нами функция для вывода текста используется сравнительно редко. Она часто применяется системой отображения меню для указания недоступных пунктов, закрашиваемых серым цветом. Для этого пришлось разработать отдельную функцию потому, что не все видеоадаптеры и мониторы обеспечивают достаточное число градаций серого цвета (например, монохроматические мониторы). В этом случае используется вывод линии не чистым цветом, а смешанным.
Так как Windows использует в качестве цвета текста только чистый цвет, то пришлось разработать специальную функцию, позволяющую осуществлять вывод смешанным цветом. Основная идея ее работы заключается в следующем:
BOOL GrayString( hDC, hBrush, lpfnDraw, lParam, cChars, nX, nY, nWidth, nHeight );
текст выводится черным цветом в промежуточный контекст устройства, ассоциированный с белым битмапом
выполняется операция OR между выведенным текстом и кистью, состоящей из черных и белых точек в шахматном порядке (Функция PatBlt(), ROP код равен 0xFA0089 (DPo))
полученный битмап переносится на контекст-приемник изображения с помощью операции BitBlt() с ROP–кодом 0xB8074A (PSDPxax), реализующей следующие действия:
( ( destination ^ pattern ) & source ) ^ pattern