Конференция "KOL" » Вопрос по Canvas [Delphi]
 
  • Vinum (22.11.07 13:07) [0]
    Всем добрый день. Вопрос в следующем. У меня на панели есть несколько линий такого характера черного света:
    form1.Panel1.Canvas.moveto(x1,y1);
    form1.Panel1.Canvas.lineto(x2,y2);
    Когда мышью шелкаю по линии, она выделяется красным.
    Вопрос: как мне сделать так, чтобы при зажатой ЛКМ и перемещении мыши по панели линия тащилась и не оставляла за собой следов перемещения и не стирала остальные линии.
    Спасибо.
  • homm © (22.11.07 13:20) [1]
    Рисовать в OnPaint, изменять координаты и посылать команду на перерисовку в OnMouseMove.
  • Vinum (22.11.07 15:18) [2]
    Очень сильно моргает панель, а если стирание осуществлять только в окрестности перемещаемой линии, то при быстром движении мышкой не успевает все стираться и остаются следы. может можно как-то это обойти??
  • Barloggg (22.11.07 15:25) [3]
    сохраняй координаты мыши при последней отрисовке.

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

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

    Кстати перекрыть событие OnEraseBkgnd тоже имеет смысл. Создай процедуру-пустышку и назначь. Должно помочь против мерцания.
  • homm © (22.11.07 15:38) [4]
    > [3] Barloggg   (22.11.07 15:25)
    > То есть создай один глобальный битмап с канвасом, дай ему
    > размер как на твоей панели и все отрисовки веди только на
    > него.

    А зачем? Если построение изоббражение не сложное, то то-же самое — DoubleBuffered = true;
  • Vinum (22.11.07 16:42) [5]
    >Кстати перекрыть событие OnEraseBkgnd
    >тоже имеет смысл. Создай процедуру-
    >пустышку и назначь.

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

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

  • homm © (22.11.07 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 (23.11.07 15:01) [7]
    Спасибо, я счастлив
 
Конференция "KOL" » Вопрос по Canvas [Delphi]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]