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 SelectClipRgn funktioniert nicht in Paint/OnPaint? (https://www.delphipraxis.net/147044-selectcliprgn-funktioniert-nicht-paint-onpaint.html)

Whookie 31. Jan 2010 20:51


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:
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;
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:

Mache ich da was falsch? Geht das so etwa nicht (setzen einer Clipping-Region innerhalb von WM_PAINT?) ...

Uwe Raabe 1. Feb 2010 08:26

Re: SelectClipRgn funktioniert nicht in Paint/OnPaint?
 
Ich benutze für rechteckiges Clipping MSDN-Library durchsuchenIntersectClipRect. Das Abschalten mache ich dann auch über SelectClipRgn.

Whookie 5. Feb 2010 08:13

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 00:34 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