Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TImage und Canvas.ClipRect (https://www.delphipraxis.net/61850-timage-und-canvas-cliprect.html)

easywk 27. Jan 2006 08:32


TImage und Canvas.ClipRect
 
Moin, moin,

ich habe auf meinem Formular ein TImage, bei dem die Eigenschaft Align auf alClient gesetzt ist. Anhand eines Buttons zeichne ich die Fläche neu:

Delphi-Quellcode:
  Img.Canvas.Brush.Color:=clWHITE;
  Img.Canvas.FillRect(Rect(0,0,Img.Width,Img.Height));
  Img.Canvas.Rectangle(0,0,Img.Width,Img.Height);
Wenn ich jetzt das Formular maximiere und die Funktion zum Neuzeichnen aufrufe, dann bekomme ich das Bild nur in der alten Größe mit dem Unterschied, dass die untere und die rechte Linie vom Rechteck fehlen. Beim Debuggen habe ich dann festgestellt, dass Img.Width und Img.Height die zur neuen Formulargröße passenden Werte haben (also verändert sind), dass Img.Canvas.ClipRect jedoch noch den alten Wert hat, weshalb ausserhalb dieses Bereichs nicht gezeichnet wird. Leider ist ClipRect read-only ...

Kann mir jemand sagen, wie ich es hinbekomme, dass bei Größenänderungen des Parentformulars nicht nur die Eigenschaft Width und Height vom Image geändert werden, sondern auch das ClipRect angepasst wird?

Gruss aus Bremen
easywk

Ferber 27. Jan 2006 08:57

Re: TImage und Canvas.ClipRect
 
Einstellung der Eigenschaft 'Stretch=True' des Images könnte helfen.

easywk 27. Jan 2006 11:30

Re: TImage und Canvas.ClipRect
 
Das funzt :-)
Danke!

EDIT:
Oder auch nicht. Da habe ich mich davon täuschen lassen, dass das Image mit Maximierung der Form seine Größe ändert. Wenn ich dann im maximierten Zustand das Bild über obige Funktion neu zeichnen lasse, stimmt das ClipRect immer noch nicht und man erhält bei Stretch=True dann eben den Bildausschnitt gestreckt ...

Die Frage ist also weiterhin offen. Die Lösung aus der Onlinehilfe mit setzen des ClipRect:
Delphi-Quellcode:
    MyRgn: HRGN ;

begin

    MyRgn := CreateRectRgn(100,100,200,200);
    SelectClipRgn(Image1.Canvas.Handle,MyRgn);
    Image1.Canvas.Brush.Color := clRed;
    Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
    Image1.Invalidate;
    SelectClipRgn(Image1.Canvas.Handle,nil);
    DeleteObject(MyRgn);

end;
funktioniert übrigens auch nicht. Mal davon abgesehen, dass SelectClipRgn(Image1.Canvas.Handle,nil); vom Compiler nicht zugelassen wird ...

xaromz 27. Jan 2006 12:36

Re: TImage und Canvas.ClipRect
 
Hallo,

das Problem mit TImage ist, dass es nur ein Container für Graphikobjecte vom Type TPicture ist (Warum wird TImage eigentlich immer wieder zum Malen mißbraucht? Dafür gibt's doch die PaintBox.).

In Deinem Fall vermute ich, dass da ein TBitmap drin ist. Pass doch einfach die Größe von Picture.Bitmap an, vielleicht hilft das.
Gruß
xaromz

easywk 27. Jan 2006 21:09

Re: TImage und Canvas.ClipRect
 
:wall: :wall: :wall:
Ich benutze selten Grafiken, die ich selber zeichnen muss ... aber daran, dass TImage nicht zum direkten Zeichnen gedacht ist, kann ich mich jetzt dunkel erinnern ....

Auf jeden Fall klappt es jetzt bestens.

Danke.

Slowbrain 30. Aug 2007 17:41

Re: TImage und Canvas.ClipRect
 
Das gleiche Problem hatte ich auch bzw. ich habe den gleichen Fehler gemacht. Mit dem Canvas einer PaintBox funktioniert die Größenänderung problemlos. Alle Zeichenalgorithmen konnten gleich bleiben. Guter Hinweis - danke!

:-D

Um es nochmal deutlicher auszudrücken: Ich habe einfach das Steuerelement vom Typ TImage gegen eines vom Typ TPaintBox ausgetauscht und den Namen der Instanz beibehalten. Schon war die Größenänderung (mittels Splitter) kein Problem mehr. Allerdings muß man sich bei einer PaintBox selber um das Neuzeichnen kümmern, was allerdings kein Problem sein sollte, da ja der Zeichenalgorithmus da ist. Da werde ich jetzt noch etwas experimentieren.


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