![]() |
Canvas: Richtig zeichnen
Hallo,
ich zeichne auf meinem Formular geometrische Formen und Linien. Dazu habe ich folgende Fragen: 1) Normalerweise wird nicht direkt auf dem Formular gezeichnet. Welche Komponente sollte ich sonst verwenden(Paintbox?)? Ich brauche auch ein vertikales und horizonales scrollen 2) Beim Minimieren des Formulars, wird die Zeichnung gelöscht. Wie kann ich das verhindern? 3) Ich habe ein button1.click und ein Form1.onCreate Ereignis. Beim onCreate wird nichts gezeichnet. Wie kann ich das ändern? 4) Wenn ich eine geometrische Form auf eine andere Form verschiebe, dann verschwindet eine der Formen. Wie kann ich das verhindern? Vielen Dank |
AW: Canvas: Richtig zeichnen
![]() ![]() Das sollte deine Frage beantworten. |
AW: Canvas: Richtig zeichnen
Zu deinen geposteten Links hätte ich noch ein paar Fragen.
1) Warum brauche ich eine Bitmap und eine Paintbox? Warum reicht z.B eine Bitmap oder nur eine Paintbox nicht aus? 2) Wenn ich das Formular so klein, wie möglich mache, verschwindet das Rechteck. Wie kann ich das verhindern? Habe überlegt, dass ich bei FormResize einfach die Repaint Methode aufrufe. Das hat aber auch nichts gebracht. Repaint wird doch, dann aufgerufen, wenn sich etwas am Formular verändert? 3) Wird bei PaintBox1.Repaint; einfach nur die Ereignisprozedur procedure TForm1.PaintBox1Paint(Sender: TObject); aufgerufen? 4) Ich habe nach einer Beschreibung der BitBlt Prozedur gesucht aber nur die Hilfe zu C++ gefunden, die ich auch nicht ganz verstehe. ![]() Was macht diese Prozedur bzw. wozu benötige ich diese?
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls; type TForm1 = class(TForm) PaintBox1: TPaintBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); procedure FormResize(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; bmp: TBitmap; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin bmp := TBitmap.Create; bmp.Canvas.Brush.Color := clred; bmp.Canvas.Pen.Width := 3; bmp.Width := Paintbox1.Width; bmp.Height := Paintbox1.Height; bmp.Canvas.Rectangle(5,5, 75, 75); end; procedure TForm1.FormDestroy(Sender: TObject); begin bmp.Free; end; procedure TForm1.FormResize(Sender: TObject); begin bmp.Width := Paintbox1.Width; bmp.Height := Paintbox1.Height; PaintBox1.Repaint; end; procedure TForm1.PaintBox1Paint(Sender: TObject); begin BitBlt(PaintBox1.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, bmp.Canvas.Handle, 0, 0, SrcCopy); end; end. |
AW: Canvas: Richtig zeichnen
Zitat:
![]() |
AW: Canvas: Richtig zeichnen
Zitat:
doch, gelesen habe ich die Beiträge. Allerdings habe ich es noch nicht so richtig verstanden. Mir ist klar, dass ein Fenster kein dauerhaften Speicher hat und ich deswegen eine Paintbox(??) und eine Bitmap(??) benötige. Warum aber reicht es nicht aus, nur auf der Paintbox oder nur auf einer Bitmap zu zeichnen? Warum benötige ich beide? Das ist mir noch nicht ganz klar. |
AW: Canvas: Richtig zeichnen
Zitat:
Man zeichnet "DoubleBuffered" (den Begriff hast du sicher schon mal in Verbindung mit Forms gehört) aus Performancegründen. Canvas-Methoden wie LineTo, Polyline oder Rectangle führt man am besten in einem In-Memory-Bitmap aus, wo noch nichts durch die Grafikkarte gepumpt werden muss. Erst wenn das Bild dort fertig gemalt ist, kopiert man den ganzen Bildinhalt per BitBlt auf ein beliebiges Canvas. |
AW: Canvas: Richtig zeichnen
Zitat:
Die erste Option ist mein Favorit. Auf die Bitmap kann man jederzeit zeichnen und sie behält ihren Inhalt. Um sie anzuzeigen ist nur wenig Kode im OnPaint-Event der Paintbox notwendig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz