Re[3]: Рисование на канве
От: Arioch2  
Дата: 25.01.06 06:33
Оценка:
Здравствуйте, Tirion, Вы писали:

T>

T>Затем рисуешь фрагмент битмапа в нужном месте, ждёшь по таймеру, смещаешь на заданное количество пикселей и опять рисуешь


T>С рисованием понятно, а как сместить на заданное количество пикселей?


Рисовать в другом месте.
Или, если на всю форму, рисовать другой (чуть сдвинутый) кусок Image
Re[7]: Рисование на канве
От: Leonid Troyanovsky  
Дата: 25.01.06 06:41
Оценка:
Здравствуйте, Tirion, Вы писали:

E>>И не обязательно перерисовывать всю канву. Достаточно перерисовать старый участок, в котором был выведен текст.


T>Это-то меня и интересует. Как это сделать?


http://groups.google.com/group/borland.public.delphi.winapi/msg/a7049e581fe4c9dc
--
С уважением, LVT
Re[2]: Рисование на канве
От: Tirion  
Дата: 25.01.06 06:42
Оценка:
Здравствуйте, 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;



Кстати, посмотрел "Руководство разработчика" (Пачеко с Тейксейра), и правда там есть пример реализации.
Re[8]: Рисование на канве
От: Tirion  
Дата: 25.01.06 07:02
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

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


E>>>И не обязательно перерисовывать всю канву. Достаточно перерисовать старый участок, в котором был выведен текст.


T>>Это-то меня и интересует. Как это сделать?


LT>http://groups.google.com/group/borland.public.delphi.winapi/msg/a7049e581fe4c9dc


Спасибо за ссылку. Очень помогло. Как раз то, что нужно.
Re[3]: Рисование на канве
От: akasoft Россия  
Дата: 25.01.06 07:44
Оценка:
Здравствуйте, Tirion, Вы писали:

T>... только при смещении слегка мерцает:


Включи двойную буферизацию (DoubleBuffered := True) при отрисовке.
... << RSDN@Home 1.2.0 alpha rev. 635>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.