Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, Tirion, Вы писали:
T>>Помогите победить.
T>>Как организовать отрисовку (DrawText()) смещение текста по вертикали со стилем кисти bsClear
E>В чем собственно проблема?
E>
E>// ...
E>with Canvas do begin
E> Brush.Style := bsClear;
E> TextOut(X, Y, S);
E>end;
E>// ...
E>
E>
Проблема в том, что при смещении текст "размазывается" т.е. все последующие отрисовки накладываются на предидущие...
var i: integer;
R: TRect;
begin
for i:=100 downto 0 do
begin
sleep(10);
with Canvas do
begin
Brush.Style := bsClear;
R:=Rect(0,i,0,0);
DrawText(Canvas.Handle,'test',-1,R,DT_NOCLIP);
end;
end;
end;
Как бы то ни было... Нужно полностью перерисовывать канву, отображая на ней текст с новыми координатами.
А R:=Rect(0,i * Canvas.TextHeight('0'),0,0); позволяет лишь растянуть смазываемый текст, а это уже не что требуется.
Здравствуйте, Tirion, Вы писали:
T>Как бы то ни было... Нужно полностью перерисовывать канву, отображая на ней текст с новыми координатами. T>А R:=Rect(0,i * Canvas.TextHeight('0'),0,0); позволяет лишь растянуть смазываемый текст, а это уже не что требуется.
Ты определись что тебе нужно... DrawText (как и другие GDI-шные функции рисования) и не должна затирать предыдущий текст, это совершенно нормальное поведение.
И не обязательно перерисовывать всю канву. Достаточно перерисовать старый участок, в котором был выведен текст.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Здравствуйте, ekamaloff, Вы писали:
E>Здравствуйте, Tirion, Вы писали:
T>>Как бы то ни было... Нужно полностью перерисовывать канву, отображая на ней текст с новыми координатами. T>>А R:=Rect(0,i * Canvas.TextHeight('0'),0,0); позволяет лишь растянуть смазываемый текст, а это уже не что требуется.
E>Ты определись что тебе нужно... DrawText (как и другие GDI-шные функции рисования) и не должна затирать предыдущий текст, это совершенно нормальное поведение.
E>И не обязательно перерисовывать всю канву. Достаточно перерисовать старый участок, в котором был выведен текст.
Здравствуйте, Arioch2, Вы писали:
T>>Это-то меня и интересует. Как это сделать?
A>А что ты вообще хочешь сделать? бегщую строку ? так для того и компоненты есть, используют TTimer с Win32: IvalidateRect
А ты не пробовал сделать бегущую строку с прозрачным фоном
Здравствуйте, Arioch2, Вы писали:
T>>А ты не пробовал сделать бегущую строку с прозрачным фоном
SetBkMode(HDC, Transparent)
???
A>Извр какой. А он над несколькими компонентами ? A>Нельзя как фон взять в точности то, что под строкой лежит ?
A>Ибо таки вся рисовка должна проходить через OnPaint /. Invalidate*
T>>>А ты не пробовал сделать бегущую строку с прозрачным фоном
SetBkMode(HDC, Transparent)
???
A>>Извр какой. А он над несколькими компонентами ? A>>Нельзя как фон взять в точности то, что под строкой лежит ?
A>>Ибо таки вся рисовка должна проходить через OnPaint /. Invalidate*
T>Ну хотя бы над TImage ...
Здравствуйте, Tirion, Вы писали:
T>Как организовать отрисовку (DrawText()) смещение текста по вертикали со стилем кисти bsClear
Алгоритмов может быть легион.
Например, заводишь Bitmap нужного размера по ширине и высоте, такой, чтобы весь твой текст поместился, в несколько строк, вычисляешь его размер в зависимости от текста, рисуешь на битмапе всё шрифтами и красиво.
Затем рисуешь фрагмент битмапа в нужном месте, ждёшь по таймеру, смещаешь на заданное количество пикселей и опять рисуешь. Рисуешь простым копированием нужного участка битмапа. Ну и т.д. В какой-то книжке по Дельфи (как бы не Пачеко с Тейксейрой) видел реализацию этого алгоритма в виде компонента.
Здравствуйте, Arioch2, Вы писали:
T>>>>А ты не пробовал сделать бегущую строку с прозрачным фоном
SetBkMode(HDC, Transparent)
???
A>>>Извр какой. А он над несколькими компонентами ? A>>>Нельзя как фон взять в точности то, что под строкой лежит ?
A>>>Ибо таки вся рисовка должна проходить через OnPaint /. Invalidate*
T>>Ну хотя бы над TImage ...
A>???
Разве это невозможно?
В TLMDTextScroll это реализовано. Я бы его использовал, если б не отсутствие выравнивания текста.
Без понятия, я не понял о чем ты говорил.
T>В TLMDTextScroll это реализовано. Я бы его использовал, если б не отсутствие выравнивания текста.
А доработать нельзя ?
Здравствуйте, akasoft, Вы писали:
A>Здравствуйте, Tirion, Вы писали:
T>>Как организовать отрисовку (DrawText()) смещение текста по вертикали со стилем кисти bsClear
A>Алгоритмов может быть легион.
A>Например, заводишь Bitmap нужного размера по ширине и высоте, такой, чтобы весь твой текст поместился, в несколько строк, вычисляешь его размер в зависимости от текста, рисуешь на битмапе всё шрифтами и красиво.
A>Затем рисуешь фрагмент битмапа в нужном месте, ждёшь по таймеру, смещаешь на заданное количество пикселей и опять рисуешь. Рисуешь простым копированием нужного участка битмапа. Ну и т.д. В какой-то книжке по Дельфи (как бы не Пачеко с Тейксейрой) видел реализацию этого алгоритма в виде компонента.