Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   Paintbox.Canvas.Draw mit Bitmap (https://www.delphipraxis.net/182777-paintbox-canvas-draw-mit-bitmap.html)

TForm1 17. Nov 2014 17:55


Paintbox.Canvas.Draw mit Bitmap
 
Hallo,
eigentlich sollte es doch nicht so schwer sein, ein Bitmap auf eine Paintbox zu zeichnen, oder?
Delphi-Quellcode:
myPaintbox.Canvas.Draw(0,0, FBitmap)
Die Bitmap wird vorher mit
Delphi-Quellcode:
FBitmap.LoadFromFile(filepath)
geladen, funktioniert alles soweit.
Warum zeichnet er dann kein Bild? Oder sollte man für solche Aktionen lieber die TImage- Komponente verwenden?

PS: Ich habe jetzt das ganze auch mal mit TextOut probiert, auch da zeigt es mir nichts an. Scheint also mehr ein Problem der Paintbox zu sein (oder es ist ein Problem von mir, dass ich das nicht richtig bedienen kann :roll:)

stahli 17. Nov 2014 18:24

AW: Paintbox.Canvas.Draw mit Bitmap
 
WANN zeichnest Du denn?
Du kannst nur in der entsprechenden Ereignisbehandlung zeichnen (OnPaint, wenn ich es noch richtig weiß).

Wenn Du "von außen" irgendwas drauf malst, wird das ggf. wieder von der Komponente selbst mit einer Hintergrundfarbe überschrieben.

TForm1 17. Nov 2014 18:40

AW: Paintbox.Canvas.Draw mit Bitmap
 
Ah ok, dann wird es daran liegen.
Bislang zeichne ich direkt beim FormCreate, damit soll sozusagen beim Start ein Hintergrundbild auf die Form gezeichnet werden.

Eine Frage: wird die OnPaint methode dann also sozusagen ständig neu aufgerufen?

stahli 17. Nov 2014 18:54

AW: Paintbox.Canvas.Draw mit Bitmap
 
Wann Windows Deine einzelnen Controls neu zeichnet kannst Du nicht direkt beeinflussen.

Wenn Deine Paintbox gezeichnet wird, wird der Hintergrund gezeichnet und das, was Du in OnPaint veranlasst.

Wenn Du ein statisches Bild darstellen willst wäre ein Image evtl. die bessere Wahl.

TForm1 17. Nov 2014 19:02

AW: Paintbox.Canvas.Draw mit Bitmap
 
Ich habe mit Absicht eine Paintbox gewählt, da ich später dann noch diverse Symbole (auch als Bitmaps) darauf anzeigen lassen will, welche sich je nachdem verändern. Dazu arbeite ich mich gerade ganz neu in eben genau dieses Thema 2D-Grafiken ein. Wenn nur beim OnPaint etwas gezeichnet wird, wie kann ich dann von Außerhalb in anderen Methoden auf die Paintbox zeichnen lassen? Eigentlich müsste doch jeglicher Aufruf der irgendetwas mit der Bearbeitung der Paintbox zu tun hat, automatisch OnPaint aufrufen?

stahli 17. Nov 2014 19:16

AW: Paintbox.Canvas.Draw mit Bitmap
 
Du kannst ja jederzeit PaintBox.Paint (bzw. Refresh o.ä.) aufrufen.
In OnPaint kannst Du dann bestimmte Bedingungen und Daten prüfen und danach dynamisch den Inhalt zeichnen.
Du musst aber immer ALLES zeichnen. Irgendwas zum letzten Stand dazu zeichnen geht nicht.

Du kannst natürlich auch extra ein Bitmap nutzen, das Du nach und nach bemalst und dieses regelmäßig in die Paintbox kopierst oder in einem Image darstellen lässt.

TForm1 17. Nov 2014 19:37

AW: Paintbox.Canvas.Draw mit Bitmap
 
ok, dann ist alles klar. Ich frage mich nur, ob es nicht eine weniger rechenintensive Methode gäbe. Wenn man jetzt fürs Zeichnen mehrere zehntausend Abfragen benötigen würde und die Paintbox 20 mal pro Sekunde neu zeichnen würde, würde man wahrscheinlich an die Grenzen der Möglichkeiten stoßen. Aber dann würde man wahrscheinlich auch keine Paintbox mehr verwenden sondern auf große Grafikbibliotheken (OpenGL) setzen, oder? Naja, bei mir sind es Gott sei dank wahrscheinlich nicht mehr als hundert und 20 mal pro Sekunde brauch ich auch nicht.

stahli 17. Nov 2014 20:08

AW: Paintbox.Canvas.Draw mit Bitmap
 
Wenn´s schnell gehen muss ist es sicherlich sinnvoll, mehrere Bitmaps zu verwalten und diese dann schnell auf die Zeichenfläche zusammen zu kopieren.

Und wenn es noch schneller gehen soll dann bieten sich zusätzlich schnelle Grafikbibliotheken an.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz