Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   GDI und GDI+ Konfusion: Welches Canvas ist gemeint? (https://www.delphipraxis.net/163513-gdi-und-gdi-konfusion-welches-canvas-ist-gemeint.html)

Jazzman_Marburg 1. Okt 2011 18:07

GDI und GDI+ Konfusion: Welches Canvas ist gemeint?
 
Hallo Gemeinde!
Es ist zum Haareraufen -- ich versteh einfach nicht, wie ich mir folgendes Verhalten erklären soll:
Ich leite von einer Basis-Klasse (TGraphicControl) eine neue Klasse ab. Dort möchte ich mit GDI und GDI+ (Lib von Erik van Bilsen) etwas auf dem Canvas zeichnen. Die Verwirrung entsteht nun an folgender Stelle:
Delphi-Quellcode:
procedure TNeueKlasse.DrawColorBar;

var ColorBar : IGPBitmap;
...

Colorbar := TGPBitmap.Create( 450, 80);
Graphics := TGPGraphics.Create( Canvas.Handle );
Graphics.DrawImage( ColorBar, 0, 300 );

Canvas.Brush.Style := bsSolid;
Canvas.Brush.Color := clWhite;
Canvas.FillRect( Rect( 10, 450, 410, 465 ) );
Canvas.Pen.Color := clBlack;
Canvas.Rectangle( Rect( 10, 450, 410, 465 ) );
...
Die unteren 5 Zeilen sollen ein rotes Rechteck mit schwarzer Umrandung zeichnen. Soweit ok.
Aber: Sobald ich die ersten 3 Zeilen auskommentiere sehe ich kein rotes Rechteck mehr!
Dabei haben diese drei Zeilen doch garnichts (?) mit den unteren Zeilen zu tun, oder doch?
In diesen oberen drei Zeilen bereite ich das GDI+ Zeichnen vor -- da ich es an dieser Stelle aber doch nicht benötige, habe ich es mal auskommentiert und war verbrlüfft, dass auch das normale GDI Zeichnen nicht mehr wollte. Es wird schlicht nichts gezeichnet.
Kann das jemand erklären?

Vielleicht nocht eine kleine Zusatzfrage:
Betrachten wir nur mal die ersten drei Zeilen. Damit kann ich auf dem Canvas, wo die Basisklasse schon etwas gezeichnet hat, zeichnen -- aber nicht darüberhinaus! Also ich kann kein Rechteck außerhalb dieses Canvas's zeichnen.
Mit den unteren 5 Zeilen hingegen kann ich locker auch darüberhinaus zeichnen. D.h. das GDI+ ist auf das Canvas der Basisklasse beschränkt, das normal GDI hingegen nicht. Das ist doch sehr merkwürdig.

Kann mir jemand meine Verwirrung ein wenig helfen zu entwirren?

Lieben Dank & Gruß
Jazzman

freeway 2. Okt 2011 11:37

AW: GDI und GDI+ Konfusion: Welches Canvas ist gemeint?
 
1te
die 3er & 5er Zeilen sollten unabhängig voneinander sein, 3er erzeugt ein Bild, 5er malt was
evtl. hilft nach dem Auskommentieren nochmals das Program zu compilieren & erzeugen

2te Frage
3 Zeilen die Grösse ist vorgegeben, der Rest ist dann nicht sichtbar
5 Zeilen der (Tform) Canvas ist beliebig erweiterbar, mach mal das fenster grösser oder kleiner

Jazzman_Marburg 3. Okt 2011 11:55

AW: GDI und GDI+ Konfusion: Welches Canvas ist gemeint?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo freeway,

ach... wenns doch so einfach wäre :-(

Zitat:

Zitat von freeway (Beitrag 1127957)
1te Frage
die 3er & 5er Zeilen sollten unabhängig voneinander sein, 3er erzeugt ein Bild, 5er malt was
evtl. hilft nach dem Auskommentieren nochmals das Program zu compilieren & erzeugen

Das hilft leider garnicht -- und dass diese Zeilen unabhängig voneinander sein sollten, hatte ich auch gedacht, deswegen ja meine Anfrage. Ich kann ja mal demonstrieren, dass sie nicht unabhängig voneinander sind:
Das nachfolgende Coding erzeugt ein Bild1. Danach lösche ich Zeile 3 (Graphics.DrawImage()) und erhalten Bild2. Danach lösche ich die ersten 3 Zeilen komplett und erhalte Bild3.
Delphi-Quellcode:
procedure TMeineNeueKlasse.DrawColorBar;
var
  Graphics : IGPGraphics;
  ColorBar : IGPBitmap;

begin

  ColorBar := TGPBitmap.Create ( 50, 50 );
  Graphics := TGPGraphics.Create( Canvas.Handle );
  Graphics.DrawImage( ColorBar, 0, 50 );

  Canvas.Pen.Color := clRed;
  Canvas.Rectangle( Rect( 10, 450, 410, 465 ) );

  Canvas.Refresh;

end;
Auf Bild1 sieht man den roten Rahmen unterhalb des Schachbretts -- der m.E. mit einfachen GDI Mitteln gezeichnet wurde. Und obwohl die ersten drei Zeilen (GDI+) keine Verbindung zum Canvas haben (?) sind sie doch die Voraussetzung, dass überhaupt was gezeichnet wird. Dieses Verhalten verstehe ich nicht.

Zitat:

Zitat von freeway (Beitrag 1127957)
2te Frage
3 Zeilen die Grösse ist vorgegeben, der Rest ist dann nicht sichtbar
5 Zeilen der (Tform) Canvas ist beliebig erweiterbar, mach mal das fenster grösser oder kleiner

Die Größe des GDI+Bitmaps ist tatsächlich vorgegeben -- aber wieso ist die Position auf das Schachbrett begrenzt?

Herrjeh, ich hoffe ich konnte mein Problem etwas verständlicher beschreiben.

Lieben Dank
Jazzman

freeway 3. Okt 2011 16:50

AW: GDI und GDI+ Konfusion: Welches Canvas ist gemeint?
 
im ersten Teil wird ein Bild erzeugt, das dann in die Canvas kopiert wird
im zweiten Teil wird direkt auf Canvas gezeichnet

ich hab mal deinen Code unter XE2 laufen lassen und deine Schritte, wie beschrieben, nachvollzogen
zumindest wird bei mir in allen 3 Fällen, das rote Rechteck, immer angezeigt, von daher kann ich dir leider nicht weiterhelfen :(

btw du solltest die Objecte die du generiert hast auch wieder freigeben
ColorBar.Free
Graphics.Free


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