Что такое код textout


С++ DrawText и TextOut не отображают ничего

Где я могу использовать TextOut или DrawText?

Я помещаю это в WM_CREATE:

Результатом является пустое окно. Я могу предоставить больше кода, если это необходимо, но это просто стандартное пустое окно Win32.

Это мое первое реальное приложение Win32, и я искал поиски в течение часа, не найдя ответа на свой вопрос.

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

(как в стороне, вы также wdc в приведенном выше коде и wdc на hdc ).

Вам нужно обработать сообщение WM_PAINT и сделать свою картину там. Вызовите BeginPaint() чтобы получить HDC, который вы можете нарисовать, и вызовите EndPaint() когда закончите.

Вы должны получить книгу начинающих в программировании Win32, так как обработка WM_PAINT — довольно простой материал. Начните с документации MSDN:

Что такое код textout

Возвращаемое значение
Отлично от нуля, если функция успешна, иначе 0.

Параметры
x
Определяет логическую x-координату отправной точки текста.
y
Определяет логическую y-координату отправной точки текста.
lpszString
Указатель на символьную строку, которая будет выведена.
nCount
Определяет число байтов в строке.
str
Объект CString , который содержит символы, которые будут выведены.

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

Что такое код textout

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

При выводе текста на канву фон надписи определяется свойством канвы Brush — кисть. Это свойство является в свою очередь объектом, который может хранить в своем свойстве Style некий шаблон заполняющей штриховки. Но по умолчанию этот шаблон соответствует сплошной закраске фона. А свойство кисти Color задает цвет фона. Атрибуты выводимого текста определяются рассмотренным в разделе 3.1 свойством канвы Font.

Вывод текста на канву может осуществляться методом TextOut, объявленным следующим образом: Процедура TextOut пишет строку текста Text на канве, начиная с позиции с координатами (X, Y). Если цвет кисти Brush в момент вывода текста отличается от того, которым закрашена канва, то текст получится выведенным в цветной прямоугольной рамке. Но ее размеры будут точно равны размерам надписи. Если требуется более красивая рамка с отступом от текста, следует применять другой метод — TextRect. Этот метод определен следующим образом:

Процедура TextRect пишет строку текста Text на канве, начиная с позиции с координатами (X, Y) — это левый верхний угол надписи. Параметр Rect типа TRect определяет прямоугольную рамку, в которую вписывается текст. Тип TRect определен следующим образом:

Координаты задаются и как четыре целых числа, определяющих координаты в пикселях левой (Left), верхней (Тор), правой (Right) и нижней (Bottom) сторон прямоугольника, и как две точки типа TPoint, представляющие собой координаты левого верхнего и правого нижнего углов:

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

При выводе текста методом TextRect часть текста, не помещающаяся в прямоугольную область Rect, усекается.

Надписи и в методе TextOut, и в методе TextRect делаются в соответствии с текущими установками шрифта Font. Пространство внутри области Rect в методе TextRect и фон надписи в методе TextOut закрашиваются текущей кистью Brush.

Для выравнивания позиции текста на канве и для задания красивой рамки в методе TextRect можно использовать методы, дающие высоту и длину выводимого текста в пикселях: методы TextWidth, TextHeight и TextExtent. Функция TextWidth: возвращает длину в пикселях текста Text, который предполагается написать на канве текущим шрифтом. Функция TextHeight: возвращает высоту в пикселях текста Text. Применение методов TextWidth и TextHeight позволяет перед выводом текста на канву определить размер надписи и расположить ее и другие элементы изображения наилучшим образом.

Имеется еще метод TextExtent, определенный следующим образом: Метод возвращает одновременно и высоту, и длину текста. Метод TextWidth возвращает то же, что TextExtent(Text).cx, а метод TextHeight возвращает то же, что TextExtent(Text).cy.

Рассмотрим примеры применения всего этого на практике. Оператор выводит текст, хранящийся в строковой переменной s, на канву формы Form1, начиная с позиции (10, 10). Если форма Form1 является той, в обработчике которой написан этот оператор, то ссылку на Form1 можно не делать: Оператор выводит текст на канву текущей формы, выравнивая его при любом шрифте по середине ширины канвы (ширина определяется свойством ClientWidth) и отступив одну строчку сверху. То же самое делает и оператор который вместо методов TextWidth и TextHeight использует метод TextExtent.

Оператор выводит текст в середину формы и по высоте и по ширине.

Примеры вывода текста методом TextOut приведены на рис. 3.2. Основной недостаток такого вывода заключается в том, что рамка текста получается без зазоров. Такой вывод выглядит некрасиво. Вероятно, вывод этой функцией оправдан только в случае, если цвет фона (свойство Canvas.Brush.Color) совпадает с цветом поверхности компонента, на канву которого выводится текст. В этом случае он просто появится без рамки.

Рис. 3.2
Примеры вывода текста методом TextOut

Более изящный вывод обеспечивает метод TextRect. Следующий код рисует в заданном месте канвы формы с координатами (X1,Y1,X2,Y2) красный прямоугольник и внутри него в центре пишет методом TextRect текст, введенный в переменную s. Если текст оказывается длиннее ширины прямоугольника, то он усекается. В данном примере будет видна только середина длинного текста, так как текст выровнен по центру.

Если в приведенном примере заменить оператор TextRect на то текст будет выводится полностью в красной прямоугольной области, на 5 пикселей отступающей во все стороны от текста. Именно этим отступом, делающим надпись более красивой, этот оператор отличается от всех предыдущих более простых операторов. Примеры вывода текста методом TextRect показаны на рис. 3.3. Вверху относительно короткий текст выровнен по середине прямоугольной рамки, в которой он рисуется. Ниже в аналогичной по размерам рамке помещен более длинный текст: «Это очень длинный текст». Вы видите, что текст урезан по размерам рамки. Внизу вы видите вывод, сделанный оператором, аналогичным приведенному выше и обеспечивающим зазор в 5 пикселей во все стороны от надписи любой длины. Очевидно, что это наиболее удачный вариант.

Рис. 3.3
Примеры вывода текста методом TextRect


В целом можно сказать, что прямой вывод текста на канву описанными методами имеет смысл использовать только в исключительных случаях. Таким исключительным случаем является вывод каких-то надписей в компонент Image (см. раздел 4.3). Этот компонент предназначен для отображения графики. Но в тех случаях, когда на графику (на какую-то картинку) требуется наложить текст, этот текст целесообразно выводить описанными методами. В остальных случаях это делать не имеет смысла, поскольку при прямом выводе текста на канву теряются преимущества визуального проектирования и приходится рассчитывать координаты размещения надписи.

WinAPI Печать текста на экране с помощью TextOut

У меня возникли проблемы в этом блоке моего кода, и я не знаю, что это такое . на TextOut линии это говорит об ошибке: инициализирует аргумент 4 из «BOOL TextOutA (HDC, Int, Int, LPCSTR, целый) ‘[-fpermissive]

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

Это просто ошибка. message представляет собой целое число , обозначающее сообщение окна , которое было получено. Я думаю, что вы хотели было вывести , textString так как вы были ссылки на его длину , как _tcslen(textString) . Измените TextOut линию , чтобы быть:

TextOutW function

The TextOut function writes a character string at the specified location, using the currently selected font, background color, and text color.

Syntax

Parameters

A handle to the device context.

The x-coordinate, in logical coordinates, of the reference point that the system uses to align the string.

The y-coordinate, in logical coordinates, of the reference point that the system uses to align the string.

A pointer to the string to be drawn. The string does not need to be zero-terminated, because cchString specifies the length of the string.

The length of the string pointed to by lpString, in characters.

Return Value

If the function succeeds, the return value is nonzero.

If the function fails, the return value is zero.

Remarks

The interpretation of the reference point depends on the current text-alignment mode. An application can retrieve this mode by calling the GetTextAlign function; an application can alter this mode by calling the SetTextAlign function. You can use the following values for text alignment. Only one flag can be chosen from those that affect horizontal and vertical alignment. In addition, only one of the two flags that alter the current position can be chosen.

Term Description
TA_BASELINE The reference point will be on the base line of the text.
TA_BOTTOM The reference point will be on the bottom edge of the bounding rectangle.
TA_TOP The reference point will be on the top edge of the bounding rectangle.
TA_CENTER The reference point will be aligned horizontally with the center of the bounding rectangle.
TA_LEFT The reference point will be on the left edge of the bounding rectangle.
TA_RIGHT The reference point will be on the right edge of the bounding rectangle.
TA_NOUPDATECP The current position is not updated after each text output call. The reference point is passed to the text output function.
TA_RTLREADING Middle East language edition of Windows: The text is laid out in right to left reading order, as opposed to the default left to right order. This applies only when the font selected into the device context is either Hebrew or Arabic.
TA_UPDATECP The current position is updated after each text output call. The current position is used as the reference point.

В

By default, the current position is not used or updated by this function. However, an application can call the SetTextAlign function with the fMode parameter set to TA_UPDATECP to permit the system to use and update the current position each time the application calls TextOut for a specified device context. When this flag is set, the system ignores the nXStart and nYStart parameters on subsequent TextOut calls.

When the TextOut function is placed inside a path bracket, the system generates a path for the TrueType text that includes each character plus its character box. The region generated is the character box minus the text, rather than the text itself. You can obtain the region enclosed by the outline of the TrueType text by setting the background mode to transparent before placing the TextOut function in the path bracket. Following is sample code that demonstrates this procedure.

Урок 3. Использование TextOut() для вывода текста на экран

Обратите внимание на то, что первая строка напечатана не до конца.
Мы указали для вывода 42 символа в последнем параметре функции TextOut(), а нужно было указать 45.
Можно автоматически определить длину строки с помощью функции strlen(), как и сделано ниже по тексту программы.
Неспеша изучите текст программы и поэксперементируйте с параметрами.
Теперь на повестке дня у нас урок рисования.

TextOut

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

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

Паpаметpы:

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

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

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


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

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

Не нуль, если наpисована; нуль — если нет. функция находится в файле gdi32.dll

Вывод текста с использованием 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

Что такое код textout

Собственно имеет место subj:
Создаём LOGFONT lf;
присваем разные поля.. в том числе и lfCharset=ANSI_CHARSET (или DEFAULT_CHARSET — это по барабану)
делаем CreateFontIndirect(&lf);
выбираем фонт в контекст и рисуем символ больше 127
TextOutA — не рисует (рисует квадратик)
TextOutW — нормально рисует

Используется шрифт собственного изготовления,
в шрифте только одна кодировка — 0 (Western)
Как это может влиять я не понимаю, но хочу понять

От: ioni
Дата: 27.11.01 20:26
Оценка:

Здравствуйте wvk, Вы писали:

wvk>Собственно имеет место subj:
wvk>Создаём LOGFONT lf;
wvk>присваем разные поля.. в том числе и lfCharset=ANSI_CHARSET (или DEFAULT_CHARSET — это по барабану)
wvk>делаем CreateFontIndirect(&lf);
wvk>выбираем фонт в контекст и рисуем символ больше 127
wvk>TextOutA — не рисует (рисует квадратик)
wvk>TextOutW — нормально рисует

wvk>Используется шрифт собственного изготовления,
wvk>в шрифте только одна кодировка — 0 (Western)
wvk>Как это может влиять я не понимаю, но хочу понять

wvk>Help please..

по моемому проблема в том что TextOutA ансишная версия и символы больше 127
это все мимо кассы

От: VladD2 www.nemerle.org
Дата: 27.11.01 20:40
Оценка:


Здравствуйте ioni, Вы писали:

I>по моемому проблема в том что TextOutA ансишная версия и символы больше 127
I>это все мимо кассы

TextOutA пользуется чарсетами. У него проблема или с их заданием или со шрифтом.

От: wvk
Дата: 28.11.01 09:52
Оценка:

Здравствуйте VladD2, Вы писали:

VD>TextOutA пользуется чарсетами. У него проблема или с их заданием или со шрифтом.
А поподробнее можно?

Вообще, может кто нибудь знает источники информации о реализации Unicode под W2k
А то MSDN я уже кажется весь перерыл, нашёл только общие слова.
Дело в том, что TextOutA действительно пользуется чарсетами,
ну так он и под NT ими пользовался, и всё было прекрасно,
при создании фонта указываешь charset ANSI и всё рисует, а под W2k — нет.
Естественно возникает мысль в чём разница в реализации, потому что в интерфейсе
никакой разницы нет — как был LOGFONT и TextOut так и остался.

В обшем, переделал я вывод под W2k на Unicode но в чём там дело — так и не понял,
а было бы интересно разобраться..

От: VladD2 www.nemerle.org
Дата: 28.11.01 18:16
Оценка:

Здравствуйте wvk, Вы писали:

А какого типа шрифт?

И какие символы выводятся? Не русские ли часом?

От: wvk
Дата: 30.11.01 08:57
Оценка:

Здравствуйте VladD2, Вы писали:

VD>А какого типа шрифт?
шрифт TTF с единственным script — western, делается в Fontographer`e
(у Fontographer`а никаких соответствующих параметров нет,
да и работал он всегда без проблем, а под W2k вдруг глюки..)

VD>И какие символы выводятся? Не русские ли часом?
символы выводятся БОЛЬШЕ 127 (какая, хрен, разница, что там стоит в других шрифтах при charset=204, у меня-то charset=0)

char buf[2];buf[0]=193;buf[1]=0;
::TextOutA(hdc,x,y,buf,1);

Что такое код textout

Здравствуйте!
У меня возник такой вопрос, при использовании функции TextOut и кисти со стилем bsClear, при выводе строки изображение «наслаивается» на предыдущее, как этого можно избежать? Если используется стиль кисти bsSolid, то всё нормально, но тогда под текстом выводится фон, который вовсе не нужен :( Вот мой код, если кто-то сможет, помогите пожалуйста. Заранее благодарен за помощь!

procedure TForm1.Timer1Timer(Sender: TObject);
var
hCanvas: TCanvas;
begin
hCanvas := TCanvas.Create;
hCanvas.Handle := GetDC(HWND_DESKTOP);

hCanvas.Font.Size := 10;
hCanvas.Font.Name := «Tahoma»;
hCanvas.Font.Color := clYellow;
// hCanvas.Brush.Style := bsSolid;
hCanvas.Brush.Style := bsClear;

hCanvas.TextOut(20, 20, TimeToStr(Time));
ReleaseDC(HWND_DESKTOP, hCanvas.Handle);
end;

Ничего не понял.

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


> TextOut и кисть bsClear, как вывести текст без фона? [D7,
> XP]

Кисти присваивается некий стиль, но сама кисть нигде не пользуется. Шрифту тоже что-то присваивается, но он-то хоть используется в hCanvas.TextOut.
Но и я тоже не понял вопроса :(


> при выводе строки изображение «наслаивается» на предыдущее,
> как этого можно избежать?

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

> [2] melnikov (09.01.07 02:56)
> Здесь время просто выводится на Рабочий стол. Когда изменяются
> секунды, то предыдущая цифра не перерисовывается, а поверх
> неё выводится новая, в результате через некоторое время
> вместо цифр получаются закрашеные квадратики.

Так а чего ты хочешь-то? С фоном тебе не нравится, без фона — тоже нет :)

Кисть влияет на вывод функции TextOut, если используется

hCanvas.Brush.Style := bsClear;

то текст выводится без фона, на Рабочий стол Windows, но предыдущий самостоятельно не затирается, т.е. нужно сначала восстановить фон под тем местом, на которое будет выведено следующее значение времени. Если используется стиль

hCanvas.Brush.Style := bsSolid;

то текст выводится нормально, т.е. старый текст «затирается», но текст выводится с фоном, а хотелось бы без фона.

Хочется использовать стиль bsClear, но нужно как-то сделать, чтобы текст отображался правильно, т.е. не наслаивался на предыдущий.


> наслаивается понятно, а избежать ты куда этого хочешь? все
> затереть?

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


> [0] melnikov (09.01.07 02:50)

Попробуй так, не совсем красиво, но так. для примера.

var
Form1: TForm1;
Bm: TBitMap;
hCanvas: TCanvas;

procedure TForm1.FormCreate(Sender: TObject);
begin
hCanvas := TCanvas.Create;
hCanvas.Handle := GetDC(HWND_DESKTOP);
Bm:=TbitMap.Create;
Bm.W > Bm.Height:=20;
Bm.Canvas.CopyRect(Bm.Canvas.ClipRect, hCanvas, Rect(100, 100, 160, 120));
hCanvas.Font.Size := 10;
hCanvas.Font.Name := «Tahoma»;
hCanvas.Font.Color := clYellow;
hCanvas.Brush.Style:=bsClear;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
BM.Free;
ReleaseDC(HWND_DESKTOP, hCanvas.Handle);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
hCanvas.CopyRect(Rect(100, 100, 160, 120), Bm.Canvas, Bm.Canvas.ClipRect);
hCanvas.TextRect(Rect(100, 100, 160, 120), 100, 100, TimeToStr(Time));
end;


> RASkov (09.01.07 05:52) [9]
> Попробуй так, не совсем красиво, но так. для примера.

О, спасибо Вам ОГРОМНОЕ за код! Вроде всё работает отлично, именно так, как и хотелось! :))

Илон Маск рекомендует:  Шаблон сайта сиреневого цвета HTML, CSS, JavaScripts, 5 страниц
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL