Canvas cleart immer [gelöst]

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Canvas cleart immer [gelöst]

Beitrag von Dragomir »

Hallo
ich hätte da ein kleines Problem :D
wenn ich eine zeichnung mit Canvas auf ein panel mache und das panel dann mit einer Procedure vergrößer verschwindet das gemalte komplett
kann mir einer sagen warum das ist und wie ich das umgehen kann?
danke im voraus :mrgreen: :mrgreen:
Zuletzt geändert von Dragomir am Di 5. Mai 2015, 15:47, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Canvas cleart immer

Beitrag von wp_xyz »

Mein Blick in die Kristallkugel sagt mir, dass du das OnClick-Event eines Buttons o.ä benutzt, um auf den Panel zu malen. Richtig ist das OnPaint-Event des Panel, denn das wird immer aufgerufen, wenn sich das Panel neu zeichnen muss.

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Canvas cleart immer

Beitrag von Dragomir »

Code: Alles auswählen

procedure TFrm_bearbeitung.Image1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer)
   begin 
        P_Bild.Canvas.Pen.Color := ColorListBox.Selected;
           ix := X;
           iy := Y;
           iy2 := Y;
           ix2 := X;
           P_Bild.Canvas.Rectangle(ix,iy,ix2,iy2);   
 
end;
 
procedure TFrm_bearbeitung.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin 
 
 
          P_Bild.Canvas.Pen.Mode := pmNotXor;
          P_Bild.Canvas.pen.Style := pssolid;
          P_Bild.Canvas.brush.Style := bsClear;
          P_Bild.Canvas.Pen.Color := ColorListBox.Selected;
          P_Bild.Canvas.Pen.Width := 3;
          P_Bild.Canvas.Rectangle(ix,iy,ix2,iy2);
          ix2 := X;
          iy2 := Y;
          P_Bild.Canvas.Rectangle(ix,iy,ix2,iy2);
end;     


die Zeichnung


Code: Alles auswählen

procedure TFrm_bearbeitung.P_untenClick(Sender: TObject);
begin
  //damit die Form nach oben gerückt wird wenn sie unten erweitert wird
  Frm_bearbeitung.top := Frm_bearbeitung.top - 50;
 
  P_Bild.Height := P_Bild.Height + 50;
  Image1.Height := Image1.Height + 50;
 
  Frm_bearbeitung.Height := Frm_bearbeitung.Height + 50;
end;



das ist meine Panel vergrößerung
sry hätte ich mitgeben sollen
Zuletzt geändert von Lori am Fr 1. Mai 2015, 13:04, insgesamt 1-mal geändert.
Grund: Bitte den Highlighter nutzen.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Canvas cleart immer

Beitrag von theo »

Ein Panel ist eigentlich nicht zum draufmalen da.
Nimm z.B. eine TPaintBox und zeichne im OnPaint Event.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Canvas cleart immer

Beitrag von Warf »

Durch die Veränderungen des Panels wird es komplett neu gezeichnet, male auf eine Bitmap, und zeichne die dann im onpaint Ereignis auf dein canvas.

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Canvas cleart immer

Beitrag von Dragomir »

Vielen dank für die Hilfen werde ich so dann versuchen bin da noch ein wenig neu was das Programmieren angeht :)

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Canvas cleart immer

Beitrag von Dragomir »

ok noch eine kleine Frage wie klappt das genau mit dem onPaint event da man ja keine parameter hat wie maustasten oder sowas :oops: :oops:

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Canvas cleart immer

Beitrag von Warf »

Du könntest entweder eine Private Bitmap deiner Klasse hinzufügen, und auf die Zeichnen (Ganz normal in den Mouse Events über MyBitmap.Canvas), und dann im OnPaint Event das auf das Control zeichnen (Control.Canvas.Draw(0, 0, MyBitmap)) oder du verwendest ein TImage (was letztlich genau das tut) hier mal ein kleines Beispiel meinerseits:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer
      );
    procedure Image1Resize(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Image1.Picture.Bitmap.Canvas.MoveTo(X, Y);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Picture.Bitmap:=TBitmap.Create;
end;
 
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
    Image1.Picture.Bitmap.Canvas.LineTo(X, Y);
end;
 
procedure TForm1.Image1Resize(Sender: TObject);
var tmp: TBitmap;
begin
  tmp:=TBitmap.Create;
  try
    tmp.Width:=Image1.ClientWidth;
    tmp.Height:=Image1.ClientHeight;
    tmp.Canvas.Brush.Color:=clWhite;
    tmp.Canvas.FillRect(0,0, Image1.Width,Image1.Height);
    tmp.Canvas.Draw(0, 0, Image1.Picture.Bitmap);
    Image1.Picture.Bitmap.Assign(tmp);
  finally
    tmp.Free;
  end;
end;
 
end.
 

Dragomir
Beiträge: 40
Registriert: Di 28. Apr 2015, 12:06

Re: Canvas cleart immer

Beitrag von Dragomir »

Danke so ist es wie ich es wollte habe da jetz noch ne frage aber dafür mache ich ein neues Thema auf hat nix damit zu tun:)

dankööööö

Antworten