Окт 14

Вывод текста с табуляцией

К сожалению, функция TextOut не обрабатывает управляющие символы, в том числе символы перевода строки \п и табуляции \t. Встретив любой такой символ, она просто выведет глиф (для системного шрифта SYSTEM_FONT) или глиф для несистемного шрифта.
В то же время табуляция широко используется в простейших текстовых редакторах для выравнивания текста по столбцам, облегчающего восприятие информации. Для обеспечения работы с табулированным текстом Windows содержит функции TabbedTextOut и GetTabbedTextExtent.
Функция TabbedTextOut имеет следующий прототип:
LONG TabbedTextOut(HDC hOC. int X. int Y. LPCTSTR IpString, int nCount. int iNumTabs. CONST LPINT IpnTabStops, int xTabOrigin);
Первые пять параметров имеют то же значение, что и у функции TextOut. Шестой параметр, iNumTabs, определяет количество позиций табуляции. Седьмой параметр, IpnTabStops, содержит указатель на массив позиций табуляции, заданных в логических единицах. Позиции табуляции должны быть отсортированы в возрастающем порядке.
Если шестой параметр равен нулю и одновременно седьмой параметр равен NULL, то позиции табуляции устанавливаются через одинаковые промежутки, равные восьмикратной средней ширине символов. Если шестой параметр равен единице, то первый элемент массива IpnTabStops содержит число символьных позиций, которое каждый раз прибавляется для определения следующей позиции табуляции.
Последний параметр, xTabOrigin, задает логическую координату по горизонтали точки отсчета позиций табуляции. Часто бывает удобно определить эту точку так, чтобы она совпадала с начальной позицией вывода строки, поскольку в этом случае массив IpnTabStops перестает быть зависимым от конкретной позиции вывода.
Если выводимая строка содержит символы табуляции \t, то GDI отображает начало строки, пока не обнаружит символ табуляции. После этого GDI просматривает массив позиций табуляций, и если первая позиция подходит для продолжения вывода (то есть она находится правее границы последнего выведенного символа строки), то вывод продолжается с этой позиции. В противном случае GDI берет следующую позицию из массива и проверяет ее и т. д. То же самое происходит при обнаружении следующего символа табуляции. Таким образом, функция не гарантирует, что символы после я-го символа табуляции будут выводиться в п-й позиции табуляции.
Позиции табуляции в массиве IpnTabStops могут быть отрицательными. В этом случае GDI использует абсолютное значение указанной величины, но выравнивает текст по правому краю перед заданной позицией, вместо выравнивания по левому краю после нее.
В случае успешного завершения функция TabbedTextOut возвращает 32-разрядное число, старшее слово которого содержит высоту, а младшее — ширину выведенной строки. В случае неудачного завершения работы возвращается нулевое значение.
Функция GetTabbedTextExtent возвращает размеры табулированного текста, не выводя его.