AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TImage und Canvas.ClipRect

Ein Thema von easywk · begonnen am 27. Jan 2006 · letzter Beitrag vom 30. Aug 2007
Antwort Antwort
easywk

Registriert seit: 9. Jul 2003
Ort: Schwanewede
117 Beiträge
 
Delphi 7 Enterprise
 
#1

TImage und Canvas.ClipRect

  Alt 27. Jan 2006, 08:32
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
Björn
if all else fails - read the instructions
  Mit Zitat antworten Zitat
Ferber

Registriert seit: 9. Mär 2005
Ort: Wien Umgebung
155 Beiträge
 
Delphi 2006 Architect
 
#2

Re: TImage und Canvas.ClipRect

  Alt 27. Jan 2006, 08:57
Einstellung der Eigenschaft 'Stretch=True' des Images könnte helfen.
Otto
  Mit Zitat antworten Zitat
easywk

Registriert seit: 9. Jul 2003
Ort: Schwanewede
117 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: TImage und Canvas.ClipRect

  Alt 27. Jan 2006, 11:30
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 ...
Björn
if all else fails - read the instructions
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#4

Re: TImage und Canvas.ClipRect

  Alt 27. Jan 2006, 12:36
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
  Mit Zitat antworten Zitat
easywk

Registriert seit: 9. Jul 2003
Ort: Schwanewede
117 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: TImage und Canvas.ClipRect

  Alt 27. Jan 2006, 21:09

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.
Björn
if all else fails - read the instructions
  Mit Zitat antworten Zitat
Slowbrain

Registriert seit: 30. Aug 2007
4 Beiträge
 
Turbo C++
 
#6

Re: TImage und Canvas.ClipRect

  Alt 30. Aug 2007, 17:41
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!



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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 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