Здравствуйте, Tirion, Вы писали:
T>T>Затем рисуешь фрагмент битмапа в нужном месте, ждёшь по таймеру, смещаешь на заданное количество пикселей и опять рисуешь
T>С рисованием понятно, а как сместить на заданное количество пикселей?
Рисовать в другом месте.
Или, если на всю форму, рисовать другой (чуть сдвинутый) кусок Image
Здравствуйте, Tirion, Вы писали:
E>>И не обязательно перерисовывать всю канву. Достаточно перерисовать старый участок, в котором был выведен текст.
T>Это-то меня и интересует. Как это сделать?
http://groups.google.com/group/borland.public.delphi.winapi/msg/a7049e581fe4c9dc
Здравствуйте, 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
Спасибо за ссылку. Очень помогло. Как раз то, что нужно.
Здравствуйте, Tirion, Вы писали:
T>... только при смещении слегка мерцает:
Включи двойную буферизацию (DoubleBuffered := True) при отрисовке.
... << RSDN@Home 1.2.0 alpha rev. 635>>