Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.11.16;
Скачать: CL | DM;

Вниз

Вопрос по Canvas   Найти похожие ветки 

 
Vinum   (2007-11-22 13:07) [0]

Всем добрый день. Вопрос в следующем. У меня на панели есть несколько линий такого характера черного света:
form1.Panel1.Canvas.moveto(x1,y1);
form1.Panel1.Canvas.lineto(x2,y2);
Когда мышью шелкаю по линии, она выделяется красным.
Вопрос: как мне сделать так, чтобы при зажатой ЛКМ и перемещении мыши по панели линия тащилась и не оставляла за собой следов перемещения и не стирала остальные линии.
Спасибо.


 
homm ©   (2007-11-22 13:20) [1]

Рисовать в OnPaint, изменять координаты и посылать команду на перерисовку в OnMouseMove.


 
Vinum   (2007-11-22 15:18) [2]

Очень сильно моргает панель, а если стирание осуществлять только в окрестности перемещаемой линии, то при быстром движении мышкой не успевает все стираться и остаются следы. может можно как-то это обойти??


 
Barloggg   (2007-11-22 15:25) [3]

сохраняй координаты мыши при последней отрисовке.

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

В общем читай как сказал homm [1], но подходи к этому творчески.
То есть создай один глобальный битмап с канвасом, дай ему размер как на твоей панели и все отрисовки веди только на него.
А при OnPaint делай копию на панель.

Кстати перекрыть событие OnEraseBkgnd тоже имеет смысл. Создай процедуру-пустышку и назначь. Должно помочь против мерцания.


 
homm ©   (2007-11-22 15:38) [4]

> [3] Barloggg   (22.11.07 15:25)
> То есть создай один глобальный битмап с канвасом, дай ему
> размер как на твоей панели и все отрисовки веди только на
> него.

А зачем? Если построение изоббражение не сложное, то то-же самое — DoubleBuffered = true;


 
Vinum   (2007-11-22 16:42) [5]

>Кстати перекрыть событие OnEraseBkgnd
>тоже имеет смысл. Создай процедуру-
>пустышку и назначь.

Не понял как перекрыть и что назначить :)

procedure TForm1.Panel1EraseBkgnd(Sender: PControl; DC: HDC);
begin
// какой код нужно написать?
end;


 
homm ©   (2007-11-22 22:39) [6]

procedure TForm1.Panel2Paint(Sender: PControl; DC: HDC);
var
 tR: TRect;
begin
 with Sender.Canvas^ do begin
   FillRect(Sender.ClientRect);
   Pen.Color := clRed;
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X+20, CurPoint.Y+20);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X+20, CurPoint.Y);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X, CurPoint.Y+20);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X-20, CurPoint.Y-20);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X-20, CurPoint.Y);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X, CurPoint.Y-20);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X+20, CurPoint.Y-20);
   MoveTo(CurPoint.X, CurPoint.Y);
   LineTo(CurPoint.X-20, CurPoint.Y+20);
 end;
end;

procedure TForm1.Panel5MouseMove(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 if MDown then begin
   CurPoint := MakePoint(Mouse.X, Mouse.Y);
   Panel5.Invalidate;
 end;
end;

procedure TForm1.Panel5MouseDown(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 MDown := TRUE;
end;

procedure TForm1.Panel5MouseUp(Sender: PControl;
 var Mouse: TMouseEventData);
begin
 MDown := FALSE;
end;


Нет мерцаний. Сделано в точночти, как в [1].


 
Vinum   (2007-11-23 15:01) [7]

Спасибо, я счастлив



Страницы: 1 вся ветка

Текущий архив: 2008.11.16;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
15-1221740044
Jeer
2008-09-18 16:14
2008.11.16
Геометрическое мышление


2-1223388590
ВитаминС
2008-10-07 18:09
2008.11.16
Вопрос про THotKey


2-1223438151
AdMeen
2008-10-08 07:55
2008.11.16
"Обратное дерево"


2-1223545575
aslanbek
2008-10-09 13:46
2008.11.16
Узнать путь файла


2-1223290088
MsGuns
2008-10-06 14:48
2008.11.16
Можно ли поместить картинку в библиотечный модуль ?