Конференция "KOL" » canvas [Delphi, Windows]
 
  • митя (05.03.15 17:48) [0]
    подскажите пожалуйста, добрые люди - как правильно делать перерисовку изображения на канве?
  • митя (05.03.15 18:05) [1]
    естественно для MCK
  • RusSun © (06.03.15 12:48) [2]
    Для Painbox

    Painbox.invalidate;
    Painbox.Update


    =Repaint.
    Перерисовка.
  • митя (06.03.15 13:18) [3]
    Чёт не то выходит - я рисую на канве мышкой а изобажение после передвижения формы затирается
  • Dimaxx © (06.03.15 14:24) [4]
    Надо самому запоминать нарисованное. Форма понятия не имеет что на ней нарисовали.
  • митя (06.03.15 14:37) [5]
    ну я так понимаю что надо записать в стрим или буфер?
  • famrus (06.03.15 21:40) [6]
    пример
  • Dimaxx © (07.03.15 00:12) [7]
    >> ну я так понимаю что надо записать в стрим или буфер?
    Можно, к примеру, перед началом перемещения слить содержимое канвы во временный битмап, а после завершения перемещения отрисовать этот битмап обратно на канву. Либо все рисование дублировать в битмап и при необходимости перерисовки отрисовывать битмап.
  • Thaddy © (25.03.15 13:54) [8]
    Here's a full example:

    program canvasdemo;
    {$IFDEF FPC}{$MODE DELPHI}{$H+}{$APPTYPE GUI}{$ENDIF}
    uses
     Kol,
     canvasdemo1 in 'canvasdemo1.pas';

    begin
     NewForm1( Form1, nil);
     Run(Form1.form);
    end.



    and

    unit canvasdemo1;

    interface
    uses
     Windows, Messages, Kol;
    const
    cps:KolString = 'Kol project in ' + {$IFDEF FPC}'Freepascal '{$ELSE}'Delphi '{$ENDIF} +
       {$IFDEF WIN64}'64 bits '{$ELSE}'32 bits '{$ENDIF} +
       {$IFDEF UNICODE_CTRLS}'Unicode'{$ELSE}'Ansi'{$ENDIF};
    type

    PForm1=^TForm1;
    TForm1=object(Tobj)
     Form:pControl;
     Background,
     Picture:PBitmap;
     Menu:PMenu;
     x,y:Integer;
     P          : Array[0..3] of TPoint;
    public
     procedure FormMouseMove(Sender: Pcontrol;var Mouse:TMouseEventData);
     procedure DoPaint(Sender: Pcontrol;DC:HDC);
     procedure DoMenu(sender:PMenu;index:integer);
    end;

    procedure NewForm1( var Result: PForm1; AParent: PControl );

    var
     Form1:pForm1;

    implementation

    procedure NewForm1( var Result: PForm1; AParent: PControl );
    begin
     New(Result,Create);
     with Result^ do
     begin
       Form:= NewForm(AParent,cps);
       Applet:=Form;
       Form.Add2AutoFree(Result);
       Form.OnPaint := DoPaint;
       Form.OnMouseMove := FormMouseMove;
       Menu :=NewMenu(form,0,['&File','(','Load &Background','Load &Picture','-','E&xit',')'],DoMenu);
       Background := NewBitmap(Form.ClientWidth,Form.ClientHeight);
       Picture := NewBitmap(0,0);
       Form.DoubleBuffered := true;
     end;
    end;

    procedure TForm1.DoMenu(sender: PMenu; index: integer);
    begin
     case index of
     1,2: with NewOpenSaveDialog('Load bitmaps','.',[OSFileMustExist,OSReadOnly])^ do
          begin
            Filter :='Bitmap files|*.bmp';
            if execute then
              if index =1 then
                Background.LoadFromFile(Filename)
              else
              begin
                Picture.LoadfromFile(Filename);
                P[0] := MakePoint((form.clientwidth - picture.width) div 2,(form.clientheight- picture.height) div 2);
                P[1] := P[0]; Inc(P[1].X,picture.Width);
              end;
              form.Invalidate;
          end;
     4:Applet.Close;
     end;
    end;

    procedure TForm1.DoPaint(Sender: Pcontrol; DC: HDC);
    var
    Pt:Integer;
    begin
     Background.StretchDraw(DC,Form.ClientRect);
     Picture.Draw(dc,P[0].X,P[0].Y);
    end;

    procedure TForm1.FormMouseMove(Sender: Pcontrol;
     var Mouse: TMouseEventData);
    begin
     if Boolean(Mouse.shift  and  MK_LBUTTON) then
     begin
       form.BeginUpdate;
       if PtInRect(MakeRect(P[0].x,P[0].Y,P[1].X,P[1].Y),MakePoint(Mouse.X,Mouse.Y)) then
       P[0] := MakePoint(Mouse.X-Picture.width div 2,Mouse.y-Picture.Height div 2);
       P[1]:=P[0];
       inc(P[1].X,Picture.Width);
       inc(P[1].Y,Picture.Height);
       DoPaint(form,form.canvas.Handle);
       form.EndUpdate;
     end;
    end;

    end.

  • Thaddy © (25.03.15 14:00) [9]
    Oh,

    In form creation:

    form.add2autofree(background);
    form.add2autofree(picture);

    Load a background bitmap and a picture.

    You can draw the picture across the background with the mouse.
  • famrus (25.03.15 17:27) [10]
    cool)
  • Thaddy © (29.03.15 13:45) [11]
    Too fast again
    Found another leak :(


    procedure TForm1.DoMenu(sender: PMenu; index: integer);
    begin
     case index of
     1,2: with NewOpenSaveDialog('Load bitmaps','.',[OSFileMustExist,OSReadOnly])^ do
          try
            Filter :='Bitmap files|*.bmp';
            if execute then
              if index =1 then
                Background.LoadFromFile(Filename)
              else
              begin
                Picture.LoadfromFile(Filename);
                P[0] := MakePoint((form.clientwidth - picture.width) div 2,(form.clientheight- picture.height) div 2);
                P[1] := P[0]; Inc(P[1].X,picture.Width);
              end;
            finally
              free;
              form.Invalidate;
          end;
     4:Applet.Close;
     end;
    end;

  • митя (18.04.15 15:55) [12]
    procedure TForm1.KOLFormMouseDown(Sender: PControl;
     var Mouse: TMouseEventData);     //Процедура на нажатиe кнопки мыши
    begin
    form.Canvas.MoveTo(Mouse.x,Mouse.y);
    form.Canvas.Pixels[Mouse.x,Mouse.y]:=clBlack;//Назначение цвета точки
    end;

    procedure TForm1.KOLFormMouseMove(Sender: PControl;
     var Mouse: TMouseEventData);
    begin
     if Mouse.Shift <> 0 then      //Процедура на движение курсора мыши
     begin
    form.Canvas.Pen.Color:=clBlack; //Назначение цвета карандаша
      form.Canvas.LineTo(Mouse.x,Mouse.y);
    end;
    end;
    собсна суть вопроса - как создать буфер и перирисовать?
  • Кладов Владимир (21.04.15 05:27) [13]
    Буфер - это битмап. Создать - это NewBitmap. Нарисовать - это TBitmap.Draw.
  • митя (21.04.15 20:54) [14]
    Спасибо

    хотелось бы уточнить как копировать канву окна на канву битмапа?
  • RusSun © (22.04.15 19:12) [15]
    Не нужно ничего копировать.

    Создаешь  битмап.
    рисуешь на нём же в событии MouseMove MouseDown

    и отрисовываешь в битмап.Draw(form.Canvas.Handle,0,0);

    У Thaddy очень подробный пример.
  • митя (23.04.15 09:47) [16]
    спасибо конечно но как бы Вам правильно сказать -
    я имел ввиду что при перемещении формы за пределы рабочегостола или когда поверх неё появляются другие форрмы то нарисованное на первой затирается - как добиться того чтобы нарисованное не затиралось ?
  • митя (23.04.15 09:47) [17]
    спасибо конечно но как бы Вам правильно сказать -
    я имел ввиду что при перемещении формы за пределы рабочегостола или когда поверх неё появляются другие форрмы то нарисованное на первой затирается - как добиться того чтобы нарисованное не затиралось ?
  • Владимир Кладов (23.04.15 18:45) [18]
    Вам уже вс сказали. Ключевая строка примера
    Form.OnPaint := DoPaint;
  • Tomek (25.11.15 03:25) [19]
    Удалено модератором
 
Конференция "KOL" » canvas [Delphi, Windows]
Есть новые Нет новых   [134427   +35][b:0.001][p:0.003]