Что такое код tabbedtextout

Что такое код tabbedtextout

Повертане значення
Розмірність рядка(у логічних модулях) як об’єкт CSize.

Параметри
x
Визначає логічну x-координату відправної точки рядка.
y
Визначає логічну y-координату відправної точки рядка.
lpszString
Вкажіть на символьний рядок, щоб вивести. Ви можете передавати або покажчик на масив символів або об’єкту CString для цього параметра.
nCount
Визначає число символів в рядку. Якщо nCount -1, довжина вичислена.
nTabPositions
Визначає число значень в масиві позицій позиції табуляції.
lpnTabStopPositions
Покажчик на масив, що містить позиції позиції табуляції(у логічних модулях). Табулятори повинні сортуватися в порядку, що збільшується; найменше x-значення має бути перший елемент в масиві.
nTabOrigin
Визначає x-координату вихідної позиції, з якої позиції табуляції розширені(у логічних модулях).
Str
Об’єкт CString, який містить певні символи.

Зауваження
Викличте цю функцію, щоб записати символьний рядок в певному розташуванні, розгортаючи позиції табуляції до значень, визначених в масиві позицій позиції табуляції. Текст написаний нині вибраному шрифті. Якщо nTabPositions — 0, і lpnTabStopPositions NULL, позиції табуляції розширені до восьми разів середньої символьної ширини.
Якщо nTabPositions 1, табулятори відділяються відстанню, певним першим значенням в lpnTabStopPositions масиві. Якщо lpnTabStopPositions масив містить більше ніж одно значення, табулятор встановлений для кожного значення в масиві, до номера, визначеного nTabPositions. NTabOrigin параметр дозволяє застосовній програмі називати функцію TabbedTextOut декількома разами для поодинокого рядка. Якщо виклики із застосовної програми більше ніж один раз з набором nTabOrigin до того ж самому значенню кожного разу, функція розгортають позиції табуляції відносно позиції, визначеної nTabOrigin.
За умовчанням, поточна позиція не використовується або модифікується функцією.Якщо застосовна програма повинна модифікувати поточну позицію, коли це викликає функцію, застосовна програма може викликати SetTextAlign функцію з набором nFlags до TA_UPDATECP. Коли цей прапорець встановлений Windows ігнорує x і y параметри на подальших зверненнях до TabbedTextOut, використовуючи поточну позицію замість цього.

Вывод текста с использованием Windows API функций

Вывод текста является одной из основных задач, которую приходится решать в программе при организации вывода данных. Речь пойдет о выводе текста с использованием Windows API функций. Данная статья, безусловно не претендует на полноту обзора этой тематики, но о некоторых «подводных камнях» я все же расскажу.

Функции, которые позволяют это выполнять, весьма разнообразны, и использовать их, как Вы уже поняли, можно в разных ситуациях и случаях, и собственно говоря, именно Вам и решать, какие использовать. Кроме функций, которые непосредственно выводят текст, также существует внушительный список «подсобных» функций.
Давайте глянем на tCanvas. В этом классе реализовано только две функции TextOut и TextRect. Когда задача стоит просто в выводе текста на цветном фоне (например, combo box цветов), то функций этого класса предостаточно, и в большинстве случаев я ими и пользуюсь. Но давайте заглянем за ширму. Функция TextOut использует одноименную функцию Windows, а TextRect использует функцию ExtTextOut, т.е. если на прямую вызывать функции Windows, можно получить тот же результат. Кроме того, в этих функциях есть передаваемые параметры, которые класс прячет, использование которых в определенных ситуациях не может быть не нужным и полезным. Формат функций я буду приводить из модуля windows.pas поставляемый с Delphi 3. Справочную информацию о передаваемых параметрах Вы сможете посмотреть в файле справки, но давайте я первый раз все же расскажу. Все GDI функции вывода имеют параметр DC — контекст устройства, на который нужно нарисовать. Естественно, Canvas подставляет туда Canvas.Handle. Если Вы хотите нарисовать на чем-то другом, то должны самостоятельно получить контекст устройства функциями, типа GetDC. Не забывайте (!) освобождать ресурсы функцией ReleaseDC.

X, Y — привязочные координаты, относительно которых происходит прорисовка. По умолчанию, привязка выполнена к левому верхнему углу. Я конечно немного не правильно выразился — в Windows принято понятие «выравнивание», а не «привязка». Оно настраивается через функцию SetTextAlign, но о ней чуть позже.

Str — переменная, которая содержит выводимый текст, а Count — длина этого текста. В качестве переменной Str можно использовать переменную, типа array [0..n] of Chat; можно передавать просто текст: ‘Пример текста’. Если текст находится у Вас в переменной типа string то нужно произвести приведение типов: PChar(VarString). Как видно уже с самого названия и предаваемых параметров, функция имеет гораздо больше возможностей, нежели предыдущая. Прежде всего, текст выводится в прямоугольнике, т.е. как бы сперва выводится прямоугольник, а затем в нем текст, но гораздо быстрее, чем это производилось бы двумя функциями.

Если значение Options будет содержать ETO_CLIPPED, то текст будет виден только в указанном прямоугольнике. Заметьте, что в функцию передается PRect. Это означает, что параметр может быть пустым, т.е. nil. В этом случае, функция будет работать аналогично TextOut. Если вы используете переменную r:tRect, то в функцию должны передать @r.

Илон Маск рекомендует:  Как сделать мигающий текст

Выравнивание также, устанавливается предварительно при помощи SetTextAlign.

Наиболее интересен параметр DX. Это ссылка на массив, типа array [0..n] of integer, где каждый элемент является шириной символа. Настоящая ширина может отличатся от указанного значения. Это можно использовать, например, для имитации моноширного шрифта, или для сжатия текста таким образом, чтоб он помещался в отводимую область. В отличии от предыдущих функций, функция DrawText не имеет параметров X, Y и использует для руководства координат параметр lpRect. Заметим, что этот параметр является переменной, т.к. функция может модифицировать значения, если ее вызвать с параметром uFormat равным DT_CALCRECT, при этом прорисовка не будет осуществлятся. Параметр uFormat может включать в себя все значения выравнивания по этому предварительной глобальной настройки при помощи SetTextAlign не требуется.

По умолчанию текст, который не вместится в lpRect будет обрезаться. Чтобы этого не происходило, в параметре uFormat используйте DT_NOCLIP.

Используйте DT_WORDBREAK, если необходимо отобразить текст в несколько строк. Без этого параметра, даже если в строке есть символ #13 (перевод строки), все равно текст будет выводится в одну строку. При использовании значения DT_CALCRECT и DT_WORDBREAK изменятся будет lpRect.bottom, без DT_WORDBREAK — lpRect.right.

По-прежнему есть проблема с вертикальным выравниванием по центру (DT_VCENTER). Оно работает только для однострочного текста, т.е. для многострочного текста сперва придется вычислить lpRect, а затем изменив lpRect.top и lpRect.bottom, добиться желаемого результата.

Используйте DT_WORD_ELLIPSIS и (или) DT_PATH_ELLIPSIS если необходимо вывести длинный текст, который не помещается в одну строку. Выглядит это примерно так: надо вывести «C:\Program Files\Borland\Delphi3\Source\VCL», а выведется «C:\Program Files\. \VCL». В этом случае, значение DT_MODIFYSTRING обязательно.

DT_NOPREFIX позволяет выводить «&», а не подчерк под следующим по тексту символом. Без этого значение в строке придется записывать «&&». Оговорюсь, что практически все функции, в названиях которых есть окончание «Ex», являются расширением одноименных функций без «Ex». В файле справки упоминается, что функции без «Ex» являются «пережитками» Windows 3.1, по этому рекомендуют использовать расширенные функции. По моему личному опыту могу судить, что разницы никакой, если Вам не нужны дополнительные параметры, и хлопоты по их заполнению :).

В данном случае добавился дополнительный параметр DTParams. При помощи него можно задать левый, правый отступ текста, величину табуляции, а также получить число символов или строк, которые не поместились в отведенный прямоугольник. Имя функции говорит само за себя — выводится текст с использованием фиксированной табуляции. В качестве lpnTabStopPositions нужно передать переменную типа array [0.. nTabPositions-1] of integer. Параметр nTabOrigin содержит х-координату начала для табуляции. Если в тексте встречается символ табуляции #9, то дальнейший вывод начинается с указанной в lpnTabStopPositions позиции.

Горизонтальное выравнивание не влияет на результат вывода. Вывод многострочного текста. В качестве параметра PolyTextArray нужно передавать переменную типа array [0.. Strings-1] of TPolyText. Структура TPolyText содержит все те же параметры, которые передаются функции ExtTextOut.
Под Windows 95/98 не поддерживается.

Примечание:
Кстати, советую всегда, перед начало освоения нового «камня преткновения» обращать на этот пункт. Лично у меня был случай, когда пишешь, пишешь, приносишь клиенту — не работает. Почему?! Читаешь MSDN: «Windows 95/98: Unsupported».

Должен огорчить всех любителей «красоты» — в Windows нет стандартной поддержки выравнивания текста по ширине. Теперь, думаю понятно, почему даже в tRichEdit нет этого.

Теперь немного о «подсобных» функциях, вызов которых влияет на результат вывода текста. Об одной из них упоминал выше — SetTextAlign. Не пугайтесь по поводу типа UINT — это обычный тип Integer. Параметр Flags должен указывать выравнивание текста как по вертикали, так и по горизонтали (TA_NOUPDATECP, TA_UPDATECP, TA_LEFT, TA_RIGHT, TA_CENTER, TA_TOP, TA_BOTTOM, TA_BASELINE). Хочу отметить два момента. Во-первых, если горизонтальное выравнивание может быть TA_CENTER, то по вертикали такого нет, и при необходимости такой реализации Вам придется соответствующим образом задавать параметр Y. Во-вторых, использование TA_UPDATECP и TA_NOUPDATECP приводит к тому, что текущая координата после вывода текста будет или не будет изменятся. Задает цвет тексту. Здесь COLORREF обычный DWORD. Я зачастую в качестве этого параметра передаю функцию RGB(r, g, b: byte) или CMYK(c, m, y, k: Byte) — это разные цветовые модели. Задает смещение каждого символа в строке относительно той точки, в которой он, должен рисоваться, т.е. если CharExtra = 1 то второй символ смещается в право на 1 пиксель, второй на 2 и т.д. Может быть отрицательным, тогда символы «налезут» друг на друга. При этом искажения начертания нет. Удлиняет или укорачивает выводимый текст на величину BreakExtra за счет изменения длины пробелов. Количество пробелов в строке указывается в BreakCount.

Ну и на последок пожалуй одна из самых основных функций, предназначенная для задания большинства параметров, это: Результат создания передается в SelectObject, а после использования желательно удалить вызвав DeleteObject. Структура TLogFont описана так: Впечатляет, правда? И так, по каждой составляющей: lfHeight — высота шрифта, то бишь, размер. Всегда задается в точках и ни каких там поинтов. Для перевода из поинтов используйте рекомендуемую во всех хелпах формулу: lfHeight — MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72); lfWidth — коэффициент сжатия по горизонтали. Значения 0 и 100 ни к чему не приводят. Меньше 100 ужимают всю строку искажая начертание, больше 100 — растягивает. При выводе на экран наблюдается дискретность равная 10, т.е. к примеру, 53 и 50 дают одинаковый результат. lfEscapement — угол поворота всей строки в десятых градуса против часовой стрелки. lfOrientation — угол поворота отдельных символов в строке в десятых градуса против часовой стрелки. lfWeight — плотность шрифта. Задается в диапазоне 0..1000. Я проверял — работает только 400 как обычный и 700 как жирный. lfItalic, lfUnderline, lfStrikeOut — ненулевое значение задает соответственно курсив, подчеркивание, перечеркивание. lfCharSet — набор символов. Чтобы не читать иероглифы, задайте как RUSSIAN_CHARSET. lfOutPrecision — точность вывода. Рекомендуют задавать OUT_TT_ONLY_PRECIS lfClipPrecision — точность отсечения символов. Рекомендуют задавать CLIP_DEFAULT_PRECIS. lfQuality — качество вывода шрифта. Ставьте PROOF_QUALITY — не помешает. Ну а про использование ANTIALIASED_QUALITY Вы в курсе — работает только начиная с Win98. lfPitchAndFamily — в двух младших разрядах указывается тип шрифта, а в четырех старших — семейство. Этот параметр можно не задавать, если указать имя существующего шрифта. lfFaceName — имя шрифта. Остальные функции, предназначены для получения различной информации о шрифтах, размерах и т.п. (GetTextExtentPoint, EnumFontFamiliesEx, GetFontData, GetCharABCWidths, GetCharWidthFloat и т.д.), но это уже другая тема.

Илон Маск рекомендует:  Книги о сайтах, об основах создания сайта

Copyright © 2004-2020 «Delphi Sources». Delphi World FAQ

Что такое код tabbedtextout

Привет всем!
Проблема у меня возникла, когда я стал использовать массивы с переменной длиной в сабже. В массиве этом хранятся отступы для табов. То есть для array[0..3] of DWORD все Ок. А при array of DWORD Используется только первый элемент массива. Делал и LocalAlloc() — не помогает!

Исползуй SetLength(при этом индекс начинается с 0)

procedure TForm1.Button1Click(Sender: TObject);
var
tabpos: array of integer;
begin
SetBKMode(Canvas.Handle, TRANSPARENT);
SetLength(TabPos,3);
TabPos[0]:=50;
TabPos[1]:=100;
TabPos[2]:=200;
TabbedTextOut( Canvas.Handle, 10, 10,
PChar(«1234″#9″5678″#9″0123″#9″4567»),
19, 3, TabPos[0], 0 );
end;

TO MBo> А у меня не работает, почему-то Delphi видит только нулевой элемент.
TO Cobalt> Я знаю о SetLength и массивах с переменной длиной, но НЕ РАБОТАЕТ!
Пока ставлю предопределенную длину 200 (заведомо большую) и заполняю, а при вызове функции указываю в качестве 6-ого параметра необходимое количество.

>AlexandrRya
Я проверял в D5, Win98 и XP — все работает примерно так:

1234 5678 0123 4567

Ты уверен, что мой скопированный код у тебя не работает?
Если по-своему делал, то обрати внимание — для динамического массива используется TabPos[0], а не просто TabPos

>MBo
Спасибо!
Твой пример точно работает.
Кстати, если уж зашла об этом речь, то почему через LocalAlloc не проходит, ведь массив — всего лишь указатель?

>почему через LocalAlloc не проходит
Хм, довольно экзотично выделяешь память, и, возможно, неправильно применяешь.
Все работает

type pa=^ta;
ta=array[byte] of dword;
var
tabpos:pa;
begin
SetBKMode(Canvas.Handle, TRANSPARENT);
tabpos:=Pointer(LocalAlloc(LMEM_FIXED,3*sizeOf(Dword)));
TabPos[0]:=50;
TabPos[1]:=100;
TabPos[2]:=200;
TabbedTextOut( Canvas.Handle, 10, 10,
PChar(«1234″#9″5678″#9″0123″#9″4567»),
19, 3, TabPos[0], 0 );

var
Arr:DWORD;
dwSize:DWORD;
begin
dwSize:=sizeof(DWORD);
try
Arr:=LocalAlloc(LPTR,123*dwSize);
except
.
end;
PDWORD(Arr+4*dwSize)^:=4321;
.
TabbedTextOut(. Pointer(Arr). );
Localfree(Arr);

dwSize:=sizeof(DWORD);
Arr:=LocalAlloc(LPTR,123*dwSize);
PDWORD(Arr)^:=50;
PDWORD(Arr+dwSize)^:=150;
PDWORD(Arr+2*dwSize)^:=300;
TabbedTextOut( Canvas.Handle, 10, 10,
PChar(«1234″#9″5678″#9″0123″#9″4567»),
19, 3, PDWORD(Arr)^, 0 );

Да нет, я понимаю, что

надо делать, просто не стал писать.
На самом деле меня вполне устроит вариант с SetLength(), просто было интересно.
Спасибо за ликбез!

Что такое код tabbedtextout

In standard C++, I am using ‘ TabbedTextOut()’ function to output text.

My application calls the function more than once with the parameter ‘ nTabOrigin’ set to the same value each time. So that I call ‘TabbedTextOut’ function several times for a single line.

Such as I output text ‘jumpto A’, firstly I output ‘jumpto’ by using »TabbedTextOut(. )’, then I output ‘ A’ by using ‘TabbedTextOut(. )’.

But I found that the character ‘o’ had been truncated. When the font was set 10, the phenomenon was obvious. Is it a bug of this API?

Прочитайте онлайн СПРАВОЧНИК ПО WinAPI | TabbedTextOut

Описание: function TabbedTextOut(DC: HDC; X, Y: Integer; Str: PChar; Count, TabPositions:

Integer; var TabStopPositions; TabOrigin: Integer);

Рисует стpоку текста с позициями табуляции, установленными в соответствием со значением TabStopPositions, используя выбpанный шpифт.

Паpаметpы:

DC: Идентификатоp контекста устpойства.

X, Y: Начальная точка стpоки.

Str: Рисуемая стpока.

Count: Размеp Str (в символах).

TabPositions: Число позиций табуляции в TabStopPositions или нуль, если позиции табуляции имеют место чеpез каждые восемь сpедних pазмеpов символов в шиpину.

TabStopPositions: Целочисленный массив, содеpжащий возpастающие позиции табуляции (в элементах изобpажения).

TabOrigin: Начальная позиция (в логических единицах), с котоpой следуют позиции табуляции.

Возвpащаемое значение:

Не используется. функция находится в файле user32.dll

Что такое код tabbedtextout

Эта функция-член вызывается для записи строки символов в заданном месте, развернуть вкладки к значениям, заданным в массиве мест табуляции.

Идентифицирует логический координату x начальной точки строки.

Идентифицирует логический координату y начальной точки линии.

Указывает на символьную строку для рисования. Можно передавать или указатель на массив знаков или объект CString для этого параметра.

Указывает число символов в строке. Если nCount 1, то длина вычисляется.

Указывает число значений в массиве мест табуляции.

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

Илон Маск рекомендует:  Плагин к фотошопу, и как его сделать

Указывает координату x начальной позиции табуляции из которой развернуты (в логических единицах).

Объект CString, который содержит указанные символы.

Измерения строки (в логических единицах) как объект CSize.

Запись текста выбранного в настоящий момент шрифте. Если nTabPositions 0 и lpnTabStopPositionsNULL, то вкладкам развернуты до 8 раз средняя ширина символов.

Если nTabPositions 1, то позиции табуляции разделяются по диапазону указанным первым значением в массиве lpnTabStopPositions. Если массив lpnTabStopPositions содержит более одного значения, то позиция табуляции устанавливается для каждого значения в массиве до числа, определенного nTabPositions. Параметр nTabOrigin позволяет приложению вызывать функцию TabbedTextOut несколько раз для одной линии. Если приложение вызывает функцию несколько раз с nTabOrigin устанавливаемое с тем же значением, каждый раз, то функция развернуть все вкладки относительно позиции, указанной nTabOrigin.

По умолчанию текущая позиция не используется и не изменялись функцией. Если приложению необходимо обновить текущую позицию, когда он вызывает функцию, приложение может вызвать функцию-член SetTextAlign с nFlags, для TA_UPDATECP. Если пометить установлен, Windows не учитывает параметры x и y при последующих вызовах TabbedTextOut, используя текущее положение.

789 — CDC::TabbedTextOut / MFC Справка / Visual C++

Шаг 789 — CDC::TabbedTextOut

Возвращаемое значение
Размерность строки (в логических модулях) как объект CSize.

Параметры
x
Определяет логическую x-координату отправной точки строки.
y
Определяет логическую y-координату отправной точки строки.
lpszString
Укажите на символьную строку, чтобы вывести. Вы можете передавать или указатель на массив символов или объекта CString для этого параметра.
nCount
Определяет число символов в строке. Если nCount -1, длина вычислена.
nTabPositions
Определяет число значений в массиве позиций позиции табуляции.
lpnTabStopPositions
Указатель на массив, содержащий позиции позиции табуляции (в логических модулях). Табуляторы должны сортироваться в увеличивающемся порядке; самое маленькое x-значение должно быть первый элемент в массиве.
nTabOrigin
Определяет x-координату исходной позиции, из которой позиции табуляции расширены (в логических модулях).
Str
Объект CString, который содержит определенные символы.

Замечания
Вызовите эту функцию, чтобы записать символьную строку в определенном расположении, разворачивая позиции табуляции к значениям, определенным в массиве позиций позиции табуляции. Текст написан в настоящее время выбранном шрифте. Если nTabPositions — 0, и lpnTabStopPositions NULL, позиции табуляции расширены до восьми раз средней символьной ширины.
Если nTabPositions 1, табуляторы отделяются расстоянием, определенным первым значением в lpnTabStopPositions массиве. Если lpnTabStopPositions массив содержит больше чем одно значение, табулятор установлен для каждого значения в массиве, до номера, определенного nTabPositions. NTabOrigin параметр позволяет прикладной программе называть функцию TabbedTextOut несколькими разами для одиночной строки. Если вызовы из прикладной программы больше чем один раз с набором nTabOrigin к тому же самому значению каждый раз, функция разворачивают позиции табуляции относительно позиции, определенной nTabOrigin.
По умолчанию, текущая позиция не используется или модифицируется функцией. Если прикладная программа должна модифицировать текущую позицию, когда это вызывает функцию, прикладная программа может вызывать SetTextAlign функцию с набором nFlags к TA_UPDATECP. Когда этот флажок установлен, Windows игнорирует x и y параметры на последующих обращениях к TabbedTextOut, используя текущую позицию вместо этого.

Есть ли функция, аналогичная TabbedTextOut(), которая может обрезать вывод, такой как ExtTextOut()?

Есть функция, похожая на TabbedTextOut() , которая может выводить символы табуляции и зажимать вывод как ExtTextOut() с флагом ETO_CLIPPED ?

Создан 09 мар. 17 2020-03-09 21:07:32 Mike32ab

Вы можете просто установить свой собственный прямоугольник отсечения. – Jonathan Potter 09 мар. 17 2020-03-09 22:06:03

1 ответ

Вы можете просто определить клип прямоугольник перед вызовом TabbedTextOut , чтобы получить желаемое поведение:

Полный пример (положить в обработчик WM_PAINT):

Я надеюсь, что это справедливо C, поскольку я, как правило, парень из C++. ;-)

FillSolidRect есть только для иллюстрации. Она определяется следующим образом:

Выход:

Создан 09 мар. 17 2020-03-09 22:35:23 zett42

Is there a function similar to TabbedTextOut() that can clip output like ExtTextOut()?

Is there a function similar to TabbedTextOut() that can output tab characters and clip the output like ExtTextOut() with the ETO_CLIPPED flag?

1 Answer 1

You can simply define a clip rectangle before calling TabbedTextOut to obtain the desired behaviour:

Full example (put in WM_PAINT handler):

I hope this is valid C code as I’m usually a C++ guy. ;-)

FillSolidRect is there just for illustration purposes. It is defined like this:

TabbedTextOut

WinApi функция TabbedTextOut

Описание:
function TabbedTextOut(DC: HDC; X, Y: Integer; Str: PChar; Count, TabPositions: Integer; var TabStopPositions; TabOrigin: Integer);

Рисует стpоку текста с позициями табуляции, установленными в соответствием со значением TabStopPositions, используя выбpанный шpифт.

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

Паpаметpы:
DC: Идентификатоp контекста устpойства.
X, Y: Начальная точка стpоки.
Str: Рисуемая стpока.

Count: Размеp Str (в символах).
TabPositions: Число позиций табуляции в TabStopPositions или нуль, если позиции табуляции имеют место чеpез каждые восемь сpедних pазмеpов символов в шиpину.
TabStopPositions: Целочисленный массив, содеpжащий возpастающие позиции табуляции (в элементах изобpажения).
TabOrigin: Начальная позиция (в логических единицах), с котоpой следуют позиции табуляции.

Возвpащаемое значение:
Не используется.

Материал взят из:
Русская спpавка по Windows API

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL