Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   GDI+ : DrawRectangle erst beim 2. Aufruf sichtbar (https://www.delphipraxis.net/160460-gdi-drawrectangle-erst-beim-2-aufruf-sichtbar.html)

Jazzman_Marburg 14. Mai 2011 08:22

GDI+ : DrawRectangle erst beim 2. Aufruf sichtbar
 
Moin Gemeinde!

Ich habe hier ein Problemchen mit GDI + (ich nutze die ansonsten vorzügliche GDIplus Library von Erik van Bilsen).
Ich lade und zeige eine Grafik mit:

Delphi-Quellcode:
Image := TGPImage.Create(Filename);
Graphics := TGPGraphics.Create(Main_Form.MainImage.Canvas.Handle);
Graphics.DrawImage(Image, 0, 0, Image.Width, Image.Height);
Das klappt auch sofort prima. Nun male ich zwei Rechtecke auf eben diese Grafik mit:

Delphi-Quellcode:
Graphics.DrawRectangle(GreenPen, ...);
Graphics.DrawRectangle(BlackPen, ...);
Diese beiden Rechtecke werden aber erst beim zweiten Aufruf der selben Procedure sichtbar. Beim rersten Aufruf ist immer nur die geladene Grafik zu sehen.
Fehlt hier irgendwas wie ein "Refresh" oder etwas Vergleichbares. (Bin neu im GDIplus Geschäft)

Wenn da vielleicht jemand eine Idee hätte?

Gruß
Jazzman

alfold 14. Mai 2011 08:38

AW: GDI+ : DrawRectangle erst beim 2. Aufruf sichtbar
 
Da dies nur im Speicher passiert musst Du nach änderungen immer Paint oder Refresh aufrufen, damit Deine VCL auch aktuallisiert wird.

Entweder musst Du Deine MainForm refreshen oder Graphics.Refresh aufrufen.

Gruss alfold

Jazzman_Marburg 14. Mai 2011 10:10

AW: GDI+ : DrawRectangle erst beim 2. Aufruf sichtbar
 
Hallo!

Zitat:

Zitat von alfold (Beitrag 1100731)
Da dies nur im Speicher passiert musst Du nach änderungen immer Paint oder Refresh aufrufen, damit Deine VCL auch aktuallisiert wird.

Entweder musst Du Deine MainForm refreshen oder Graphics.Refresh aufrufen.

Gruss alfold

Hmm, das funktioniert so leider nicht.
Also direkt nach dem Graphics.DrawRectangle(GreenPen, ...); rufe ich:
Delphi-Quellcode:
  Main_Form.MainImage.Refresh;
  Main_Form.MainImage.Update;
  Main_Form.MainImage.Invalidate;
Kein Unterschied: die Dinger werden erst nach dem zweiten Aufruf sichtbar.

Ein:
Delphi-Quellcode:
Graphics.Refresh
Gibt es leider nicht. Das GDIplus (zumindest das von Erik van Bilsen) schitn das nicht zu haben.

Hmmm...

Danke & Gruß
Jazzman

alfold 14. Mai 2011 10:36

AW: GDI+ : DrawRectangle erst beim 2. Aufruf sichtbar
 
Was ist MainImage für eine Komponente?
Ansonsten Main_Form.refresh.

Gruss alfold

Jazzman_Marburg 14. Mai 2011 11:30

AW: GDI+ : DrawRectangle erst beim 2. Aufruf sichtbar
 
Zitat:

Zitat von alfold (Beitrag 1100746)
Was ist MainImage für eine Komponente?
Ansonsten Main_Form.refresh.

MainImage := TImage;

Ich habe jetzt mal mit der Stelle rumgespielt, an der ich das Graphics erzeuge, und siehe da, wenn ich es folgendermaßen mache, wird auch beim ersten Aufruf schon korrekt gezeichent:
Delphi-Quellcode:
  Graphics := TGPGraphics.Create(Main_Form.MainImage.Canvas.Handle);
  Graphics.DrawRectangle(GreenPen, ...);
  Graphics.DrawRectangle(BlackPen, ...);
  Graphics.DrawImage(Image, 0, 0, Image.Width, Image.Height);
Wenn ich higegen:
Delphi-Quellcode:
  Graphics := TGPGraphics.Create(Main_Form.MainImage.Canvas.Handle);
  ... // Hier anderes Coding
  Graphics.DrawRectangle(GreenPen, ...);
  Graphics.DrawRectangle(BlackPen, ...);
  Graphics.DrawImage(Image, 0, 0, Image.Width, Image.Height);
dann wird erst beim zweiten Mal korrekt gekennzeichnet.

Merkwürdig -- aber es tut's erstmal.

Vielen Dank für das Zuhören :-D

Gruß
Jazzman

alfold 14. Mai 2011 11:42

AW: GDI+ : DrawRectangle erst beim 2. Aufruf sichtbar
 
Na schön, dann sollte man evtl nicht nur 3Zeiler schreiben und den Rest verschweigen:wink:

Gruss

Jazzman_Marburg 14. Mai 2011 19:16

AW: GDI+ : DrawRectangle erst beim 2. Aufruf sichtbar
 
Zitat:

Zitat von alfold (Beitrag 1100752)
Na schön, dann sollte man evtl nicht nur 3Zeiler schreiben und den Rest verschweigen:wink:

Gruss

Ja, tatsächlich habe ich den eigentlich Unterschied in meinem Vorgehen verschwiegen und damit zur Verwirrung beigetragen.
Aber meine 'workaround' erklärt ja auch nichts so richtig, oder?

Jazzman


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 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