Здравствуйте, 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>Затем рисуешь фрагмент битмапа в нужном месте, ждёшь по таймеру, смещаешь на заданное количество пикселей и опять рисуешь. Рисуешь простым копированием нужного участка битмапа. Ну и т.д. В какой-то книжке по Дельфи (как бы не Пачеко с Тейксейрой) видел реализацию этого алгоритма в виде компонента.
Здравствуйте, Tirion, Вы писали:
E>>И не обязательно перерисовывать всю канву. Достаточно перерисовать старый участок, в котором был выведен текст.
T>Это-то меня и интересует. Как это сделать?
Здравствуйте, akasoft, Вы писали:
A>Здравствуйте, Tirion, Вы писали:
T>>Как организовать отрисовку (DrawText()) смещение текста по вертикали со стилем кисти bsClear
A>Алгоритмов может быть легион.
A>Например, заводишь Bitmap нужного размера по ширине и высоте, такой, чтобы весь твой текст поместился, в несколько строк, вычисляешь его размер в зависимости от текста, рисуешь на битмапе всё шрифтами и красиво.
A>Затем рисуешь фрагмент битмапа в нужном месте, ждёшь по таймеру, смещаешь на заданное количество пикселей и опять рисуешь. Рисуешь простым копированием нужного участка битмапа. Ну и т.д. В какой-то книжке по Дельфи (как бы не Пачеко с Тейксейрой) видел реализацию этого алгоритма в виде компонента.
В принципе нашел вариант реализации, только при смещении слегка мерцает:
var i: integer;
R1,R:TRect;
bm2,bm: TBitmap;
h,w: integer;
begin
cl:=false;
repeat
bm:=TBitmap.Create;
bm2:=TBitmap.Create;
h:=Canvas.TextHeight('Текст');
w:=Canvas.TextWidth('Текст')+length('Текст');
bm.Height:=h;
bm.Width:=w;
bm2.Height:=h;
bm2.Width:=w;
bm.Canvas.Font.Color:=clWindow;
bm.Canvas.Font.Style:=[fsBold];
R:=Rect(0,0,w,h);
for i:=0 to Image1.Height-h do
begin
Application.ProcessMessages;
R1:=Rect(Image1.Left,Image1.Top+((Image1.Height-i)-h),Image1.Left+w,Image1.Top+(Image1.Height-i));
bm.Canvas.CopyRect(R,Canvas,R1);
bm2.Canvas.CopyRect(R,Canvas,R1);
setbkmode(bm.Canvas.Handle, Transparent);
DrawText(bm.Canvas.Handle,'Текст',-1,R,DT_NOCLIP);
Canvas.CopyRect(R1,bm.Canvas,R);
sleep(10);
Canvas.CopyRect(R1,bm2.Canvas,R);
end;
bm.Free;
bm2.Free;
until cl;
Application.Terminate;
Кстати, посмотрел "Руководство разработчика" (Пачеко с Тейксейра), и правда там есть пример реализации.
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Здравствуйте, Tirion, Вы писали:
E>>>И не обязательно перерисовывать всю канву. Достаточно перерисовать старый участок, в котором был выведен текст.
T>>Это-то меня и интересует. Как это сделать?
LT>http://groups.google.com/group/borland.public.delphi.winapi/msg/a7049e581fe4c9dc
Спасибо за ссылку. Очень помогло. Как раз то, что нужно.