![]() |
SelectClipRgn funktioniert nicht in Paint/OnPaint?
Hallo zusammen!
Ich hab mal wieder an einer Komponente gebastelt. Sie besteht aus einem Rahmenbereich und dessen Innenleben. Beim Malen (im überschriebenen Paint) wollte ich dann einen Clipping-Bereich verwenden um das Überschreiben des Randes zu verhindern. Aber sobald ich das mache, wird gar nichts mehr ausgegeben. Also habe ich das ganze mal in eine PaintBox verlagert und komme da zum selben Ergebnis:
Delphi-Quellcode:
Die rote Linie sollte nicht ganz bis "aussen" gehen, weil sie in der inneren Box geclippt wird, aber leider geht da gar nichts und ich bin mal wieder komplett ratlos :pale:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var R: TRect; iRgn: Integer; begin PaintBox1.Canvas.Pen.Color := clBlue; PaintBox1.Canvas.MoveTo(0,0); PaintBox1.Canvas.LineTo(PaintBox1.Width, PaintBox1.Height); // blaue linie v. links oben nach rechts unten ... funktioniert R := PaintBox1.ClientRect; InflateRect(R, -10, -10); iRgn := CreateRectRgnIndirect(R); SelectClipRgn(PaintBox1.Canvas.Handle, iRgn); // ab hier ist alles vorbei (wird diese Zeile auskommentiert geht auch die 2. linie) DeleteObject(iRgn); PaintBox1.Canvas.Pen.Color := clRed; PaintBox1.Canvas.MoveTo(PaintBox1.Width, 0); PaintBox1.Canvas.LineTo(0, PaintBox1.Height); //rote line bleibt unsichtbar (sollte nur "kürzer" sein) end; Mache ich da was falsch? Geht das so etwa nicht (setzen einer Clipping-Region innerhalb von WM_PAINT?) ... |
Re: SelectClipRgn funktioniert nicht in Paint/OnPaint?
Ich benutze für rechteckiges Clipping
![]() |
Re: SelectClipRgn funktioniert nicht in Paint/OnPaint?
Ja richtig, innerhalb von WM_PAINT gibts schon eine Clipping Region und daher muß man das ganze dann mit den entsprechenden Funktionen machen.
Damit sieht (der Vollständigkeit halber) der Code von oben wie folgt aus:
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var R: TRect; begin PaintBox1.Canvas.Pen.Color := clBlue; PaintBox1.Canvas.MoveTo(0,0); PaintBox1.Canvas.LineTo(PaintBox1.Width, PaintBox1.Height); R := PaintBox1.ClientRect; InflateRect(R, -10, -10); IntersectClipRect(PaintBox1.Canvas.Handle, R.Left, R.Top, R.Right, R.Bottom); PaintBox1.Canvas.Pen.Color := clRed; PaintBox1.Canvas.MoveTo(PaintBox1.Width, 0); PaintBox1.Canvas.LineTo(0, PaintBox1.Height); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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 by Thomas Breitkreuz