Ergebnis 1 bis 5 von 5

Thema: TPaintBox^^ nochmal^^

  1. #1

    TPaintBox^^ nochmal^^

    Abend

    Jo ich hab da ein Problem ...also ich zeichne etwas auf die PaintBox , so wenn man jetzt aber das fenster verzieht oder über den rand des Bildschirm bewegt löscht man das gemalte...meine frage wie kann man das verhindern ???Das ist nämlich ein sehr blöder Bug ne <_>

  2. #2
    Ich nehme an du meinst, dass sich der zerstörte Bereich nicht neu malt. (Oder dass der Bereich zerstört wird beim Resize des Bereiches, da das Flag dazu gesetzt ist).
    Ist normal bei Windows-Fenstern. Es wird nur gemerkt was sichtbar ist. Wenn dein Fenster von anderen Fenstern oder vom Rand des Monitors überlappt wird und danach wieder sichtbar wird, ist dieser Bereich "invalid" und muss neugezeichnet werden. Windows-Programme senden da die "WM_PAINT" Message an den Windows-Prozess. In diesem Abschnitt könntest du dann das Bild neu auf das Objekt legen oder nur den kleinen Abschnitt, der zerstört wurde neu zeichnen. Per "InvalidateRect()" Befehl kannst du diese Fenster-"Zerstörtung" auch simulieren und dirtekt einen Bereich auswählen der zum Neuzeichnen gekennzeichnet sein soll.
    Genauer kann ich dir das nicht erklären da ich nicht weiß welche Sprache du eigentlich verwendest und in wie fern du dich mit der WinAPI auskennst.

  3. #3
    Huups ..ich hab gedacht wenn ich T PaintBox schreibe weiss jeder das ich Delphi habe ..egal ..kann man das nicht auch irgendwie anders lösen als ein Stange Routinen zu schreiben die das macht ..und ein Problem hab ich noch ..ich weiss ja auch nicht was der Benutzer gemacht hat und kann es deswegen nicht wieder malen >_>

  4. #4
    am besten du malst in ein internes TBitmap oder TPicture objekt und blittest das dann beim neu-zeichnen (OnPaint event von TPaintBox). Hier mal nen beispiel:

    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;
    
    type
      TfMain = class(TForm)
        btDraw: TButton;
        btMvLeft: TButton;
        btMvDown: TButton;
        btMvRight: TButton;
        btMvUp: TButton;
        pPb: TPanel;
        Pbox: TPaintBox;
        procedure Button1Click(Sender: TObject);
        procedure btDrawClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure PboxPaint(Sender: TObject);
        procedure btMvDownClick(Sender: TObject);
        procedure btMvLeftClick(Sender: TObject);
        procedure btMvUpClick(Sender: TObject);
        procedure btMvRightClick(Sender: TObject);
      private
        cCVS: TBitmap;
        cX: Integer;
        cY: Integer;
      public
        { Public declarations }
      end;
    
    var
      fMain: TfMain;
    
    implementation
    
    {$R *.dfm}
    
    procedure TfMain.Button1Click(Sender: TObject);
    begin
      Pbox.Repaint;
    end;
    
    procedure TfMain.btDrawClick(Sender: TObject);
    begin
      cCVS.Canvas.Brush.Color:= clWhite;
      cCVS.Canvas.FillRect(Rect(0,0,100,100));
      cCVS.Canvas.Pen.Color:= clBlack;
      cCVS.Canvas.MoveTo(0,0);
      cCVS.Canvas.LineTo(100,100);
      Pbox.Canvas.CopyRect(Rect(0,0,100,100),cCVS.Canvas,Rect(0,0,100,100)); 
    end;
    
    procedure TfMain.FormCreate(Sender: TObject);
    begin
      cCVS:= TBitmap.Create();
      cCVS.Width:= 100;
      cCVS.Height:= 100;
      cX:=0;
      cY:=0;
    end;
    
    procedure TfMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      cCVS.Free();
    end;
    
    procedure TfMain.PboxPaint(Sender: TObject);
    begin
      Pbox.Canvas.CopyRect(Rect(cX,cY,cX+100,cY+100),cCVS.Canvas,Rect(0,0,100,100));
    end;
    
    procedure TfMain.btMvDownClick(Sender: TObject);
    begin
      inc(cY,5);
      Pbox.Invalidate;
    end;
    
    procedure TfMain.btMvLeftClick(Sender: TObject);
    begin
      inc(cX,5);
      Pbox.Invalidate;
    end;
    
    procedure TfMain.btMvUpClick(Sender: TObject);
    begin
      dec(cY,5);
      Pbox.Invalidate;
    end;
    
    procedure TfMain.btMvRightClick(Sender: TObject);
    begin
      dec(cX,5);
      Pbox.Invalidate;
    end;
    
    end.

  5. #5
    Coo so wirds gehen ..gute Idee mit der TBitmap ^^ hab ich net dran gedacht

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •