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 ClipRgnTest (https://www.delphipraxis.net/212891-cliprgntest.html)

stahli 19. Apr 2023 21:17

ClipRgnTest
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe ein kleines Testprojekt für SelectClipRgn & Co. erstellt.

Falls jemand das mal hilft, hier als Anlage...

stahli 19. Apr 2023 22:44

AW: ClipRgnTest
 
Ich muss gleich mal nachfragen...

Warum wird lRgn3 im geänderten Beispiel nicht zugewiesen?
Ich möchte die aktuelle Clipping-Region sichern und diese später wieder herstellen.

Die aktuelle Clipping-Region wird ja innerhalb von ExtSelectClipRgn verarbeitet.
Genau diese möchte ich in einer Region speichern und dachte, dafür wäre GetClipRgn da...?

Delphi-Quellcode:
  procedure TForm1.FormActivate(Sender: TObject);
  var
    lRect             : TRect;
    lRgn1, lRgn2, lRgn3: Cardinal;
  begin
    lRgn1 := 0;
    lRgn2 := 0;
    lRgn3 := 0;

    Canvas.FillRect(ClientRect);

    lRect             := TRect.Create(100, 100, 200, 200);
    Canvas.Brush.Color := clYellow;
    Canvas.FillRect(lRect);

    lRect             := TRect.Create(200, 200, 300, 300);
    Canvas.Brush.Color := clBlue;
    Canvas.FillRect(lRect);

    lRgn1 := CreateRectRgn(150, 150, 250, 250);
    SelectClipRgn(Canvas.Handle, lRgn1);
    GetClipRgn(Canvas.Handle, lRgn3); // tmp
    Canvas.Brush.Color := clGreen;
    Canvas.FillRect(ClientRect);
    GetClipRgn(Canvas.Handle, lRgn3); // tmp

    lRgn2 := CreateRectRgn(160, 160, 260, 260);
    ExtSelectClipRgn(Canvas.Handle, lRgn2, RGN_OR);
    Canvas.Brush.Color := clRed;
    Canvas.FillRect(ClientRect);

    GetClipRgn(Canvas.Handle, lRgn3); // <-- Warum wird lRgn3 nicht die aktuelle Clip-Region des Canvas zugewiesen?

    lRgn2 := CreateRectRgn(16, 16, 26, 26);
    SelectClipRgn(Canvas.Handle, lRgn2);
    Canvas.Brush.Color := clTeal;
    Canvas.FillRect(ClientRect);

    SelectClipRgn(Canvas.Handle, lRgn3); // <-- Hier sollte die gesicherte Clip-Region wieder asgewählt werden!
    Canvas.Brush.Color := clNavy;
    Canvas.FillRect(ClientRect);

    DeleteObject(lRgn1);
    DeleteObject(lRgn2);

    SelectClipRgn(Canvas.Handle, HRGN(nil));

    Canvas.Brush.Color := clBtnFace;
    Canvas.FillRect(ClientRect);
  end;

himitsu 19. Apr 2023 23:43

AW: ClipRgnTest
 
Nja, erstmal könnte man vielleicht auf die irrsinnige Idee kommen und die Rückgabewerte der Prozeduren Funktionen prüfen. :angle2:

Renate Schaaf 20. Apr 2023 04:52

AW: ClipRgnTest
 
Zitat:

Code:
    GetClipRgn(Canvas.Handle, lRgn3); // <-- Warum wird lRgn3 nicht die aktuelle Clip-Region des Canvas zugewiesen?

lRgn3 muss ein handle zu einer schon gültigen region sein. Also davor einfach
Code:
lRgn3:=CreateRectRgn(irgendwas)
dann ist der Rückgabewert von GetClipRgn 1, und das weitere funktioniert.

Renate

stahli 20. Apr 2023 06:22

AW: ClipRgnTest
 
Renate, vielen Dank!
Das funktioniert perfekt.

Ich hatte nirgendwo einen entsprechenden Hinweis gefunden..

KodeZwerg 20. Apr 2023 11:55

AW: ClipRgnTest
 
Zitat:

Zitat von stahli (Beitrag 1521260)
Ich hatte nirgendwo einen entsprechenden Hinweis gefunden..

Dann hast Du wahrscheinlich nicht die Api Beschreibung zu GetClipRgn gelesen :-D

Zitat:

A handle to an existing region before the function is called. After the function returns, this parameter is a handle to a copy of the current clipping region.
Auch wäre es Ratsam das Resultat auszuwerten wie Renate es sagt um schneller zu ermitteln warum etwas nicht funktioniert.
Zitat:

If the function succeeds and there is no clipping region for the given device context, the return value is zero. If the function succeeds and there is a clipping region for the given device context, the return value is 1. If an error occurs, the return value is -1.


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