-
Всем добрый день. Вопрос в следующем. У меня на панели есть несколько линий такого характера черного света: form1.Panel1.Canvas.moveto(x1,y1); form1.Panel1.Canvas.lineto(x2,y2); Когда мышью шелкаю по линии, она выделяется красным. Вопрос: как мне сделать так, чтобы при зажатой ЛКМ и перемещении мыши по панели линия тащилась и не оставляла за собой следов перемещения и не стирала остальные линии. Спасибо.
-
Рисовать в OnPaint, изменять координаты и посылать команду на перерисовку в OnMouseMove.
-
Очень сильно моргает панель, а если стирание осуществлять только в окрестности перемещаемой линии, то при быстром движении мышкой не успевает все стираться и остаются следы. может можно как-то это обойти??
-
сохраняй координаты мыши при последней отрисовке.
для ускорения можешь использовать прием многократной буферизации. то есть все кроме данной конкретной линии орисовано один раз и хранится в отдельном слое, потом достаешь оттуда картинку, дорисовываешь линию и только тогда выбрасываешь на экран. Работает хорошо при тяжелой графике.
В общем читай как сказал homm [1], но подходи к этому творчески. То есть создай один глобальный битмап с канвасом, дай ему размер как на твоей панели и все отрисовки веди только на него. А при OnPaint делай копию на панель.
Кстати перекрыть событие OnEraseBkgnd тоже имеет смысл. Создай процедуру-пустышку и назначь. Должно помочь против мерцания.
-
> [3] Barloggg (22.11.07 15:25) > То есть создай один глобальный битмап с канвасом, дай ему > размер как на твоей панели и все отрисовки веди только на > него.
А зачем? Если построение изоббражение не сложное, то то-же самое — DoubleBuffered = true;
-
>Кстати перекрыть событие OnEraseBkgnd >тоже имеет смысл. Создай процедуру- >пустышку и назначь. Не понял как перекрыть и что назначить :)
procedure TForm1.Panel1EraseBkgnd(Sender: PControl; DC: HDC);
begin
end;
-
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].
-
Спасибо, я счастлив
|