AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Herausfinden, ob Fenster sichtbar ist
Thema durchsuchen
Ansicht
Themen-Optionen

Herausfinden, ob Fenster sichtbar ist

Offene Frage von "Benmik"
Ein Thema von littleDave · begonnen am 25. Sep 2008 · letzter Beitrag vom 27. Dez 2016
Antwort Antwort
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#1

Herausfinden, ob Fenster sichtbar ist

  Alt 25. Sep 2008, 14:27
Servus
Ich hab da mal ne Frage:

Gibt es eine Möglichkeit herauszufinden, ob ein Fenster bzw. ob ein Teil eines Fensters überhaupt sichtbar ist oder ob das Fenster komplett von einem anderen Fenster (nicht auf ein Programm beschrenkt) verdeckt wird? Ich suche nicht die Funktion IsWindowVisible.

Hintergrund:
Für meine Desktop Widget Engine verwende ich die Funktion UpdateLayeredWindow. Bevor diese Funktion jedoch ausgeführt wird, muss das Window-Bitmap erst erstellt werden - dies kann ziemlich viel Resourcen fressen. Nun wollt ich CPU-Resourcen sparen und erstmal schauen, ob das Update überhaupt für den User sichtbar ist. Daher bräuchte ich eine Funktion, die mir sagt, ob das Fenster überhaupt sichtbar ist.

Grüße
Dave
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

Re: Herausfinden, ob Fenster sichtbar ist

  Alt 25. Sep 2008, 18:11
Hallo, dafür eignet sich die GetClipBox API.

Delphi-Quellcode:
type
  TVisibleStatus = (vsHidden, vsVisible, vsPartVisible);

function TForm1.GetVisibleStatus(wnd: HWND): TVisibleStatus;
var
  Clip: Integer;
  hDC: THandle;
  ClipRect, ClientRect: TRect;
begin
  hDC := GetDC(wnd);
  Clip := GetClipBox(hDC, ClipRect);
  case Clip of
    NULLREGION: Result := vsHidden; // Fenster ist komplett versteckt
    SIMPLEREGION:
      begin
        ClientRect := GetClientRect;
        if EqualRect(ClipRect, ClientRect) then // vollständig sichtbar
          Result := vsVisible //ClientRect ist sichtbar
        else //teils sichtbar
          Result := vsPartVisible; //ClientRect ist sichtbar
      end;
    COMPLEXREGION: // Region besteht aus mehr als einem Rechteck, Fenster ist teils sichtbar
      Result := vsPartVisible;
  end;
  ReleaseDC(Handle, hDC);
end;
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#3

Re: Herausfinden, ob Fenster sichtbar ist

  Alt 25. Sep 2008, 18:50
Danke für den Code - der Funktioniert an sich sehr gut, nur leider nicht bei meinem Problem .

Meine Fenster sind vom Style her WS_EX_LAYERED. Ich hab nach GetClipRgn + WS_EX_LAYERED gesucht und hab in einem C++Forum gefunden, dass diese Kombination nicht funktioniert - schade.

Hast du sonst noch ne Idee, wie ich das hinkriegen könnte?
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#4

AW: Herausfinden, ob Fenster sichtbar ist

  Alt 22. Nov 2016, 17:13
Ich benutze diese Funktion schon seit längerer Zeit und habe sie heute aus der Hauptform raus in eine neue Unit umgezogen. Leider funktioniert die Funktion dann nicht mehr, da eine Windows-Funktion statt der Funktion in Forms.pas verwendet wird:

ClientRect := GetClientRect; Ein Forms.GetClientRect; oder Forms.TCustomForm.GetClientRect; funktioniert leider nicht. Was muss man hier schreiben, damit die Forms.pas-Funktion verwendet wird?
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Herausfinden, ob Fenster sichtbar ist

  Alt 22. Nov 2016, 17:21
Das war schon richtig: Nur der vollständige Name der Unit aus welcher du das nehmen möchtest ist Vcl.Forms , nicht Forms . Es würde dementsprechend heißen Vcl.Forms.TCustomForm.GetClientRect() .

Konjunktiv, da GetClientRect() an eine TCustomForm -Instanz gebunden ist und keine statische Methode ist die man einfach so aufrufen kann: Du brauchst eine Form dafür, also z.B. meinRect := meineForm.GetClientRect() Das meineForm wirst du deiner Methode ja irgendwie übergeben, oder?
Kannst du vlt. die Unit mit der Methode wie du es momentan hast posten?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Herausfinden, ob Fenster sichtbar ist

  Alt 22. Nov 2016, 17:22
Du rufst ja die Methode einer TCustomForm-Instanz auf, also musst Du auch diese Instanz mit angeben.
ClientRect := FormInstanz.GetClientRect;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#7

AW: Herausfinden, ob Fenster sichtbar ist

  Alt 22. Nov 2016, 17:27
Meine aktuelle Funktion sieht momentan so aus. Ich habe nur die markierte Stelle geändert aber leider habe ich keinen Zugriff auf GetClientRect.

Delphi-Quellcode:
function GetVisibleStatus(const PForm: TForm): TVisibleStatus;
var
 Clip: Integer;
 hDC: THandle;
 ClipRect, ClientRect: TRect;
begin
 hDC := GetDC(PForm.Handle);
 Clip := GetClipBox(hDC, ClipRect);

 case Clip of
  NULLREGION:
   Result := vsHidden; // Fenster ist komplett versteckt
  SIMPLEREGION:
   begin
    ClientRect := PForm.GetClientRect; // nur das hier habe ich geändert

    if EqualRect(ClipRect, ClientRect) then // vollständig sichtbar
     Result := vsVisible // ClientRect ist sichtbar
    else // teils sichtbar
     Result := vsPartVisible; // ClientRect ist sichtbar
   end;
  COMPLEXREGION: // Region besteht aus mehr als einem Rechteck, Fenster ist teils sichtbar
   Result := vsPartVisible;
 end;

 ReleaseDC(Handle, hDC);
end;
Die letzte Zeile verstehe ich auch nicht. Müsste da nicht eigentlich PForm.Handle stehen und nicht Handle?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Herausfinden, ob Fenster sichtbar ist

  Alt 22. Nov 2016, 17:37
Wie ist es so (ungetestet)?
Delphi-Quellcode:
function GetVisibleStatus(const PForm: TForm): TVisibleStatus;
var
 Clip: Integer;
 hDC: THandle;
 ClipRect, ClientRect: TRect;
begin
  Assert(Assigned(PForm), 'Keine TCustomForm-Instanz übergeben');
  hDC := GetDC(PForm.Handle);
  if hDC <> 0 then
    try
      Clip := GetClipBox(hDC, ClipRect);
      
      case Clip of
        NULLREGION:
          Result := vsHidden; // Fenster ist komplett versteckt
        SIMPLEREGION:
          begin
            ClientRect := PForm.ClientRect; // Property statt protected Getter
            
            if EqualRect(ClipRect, ClientRect) then // vollständig sichtbar
              Result := vsVisible // ClientRect ist sichtbar
            else // teils sichtbar
              Result := vsPartVisible; // ClientRect ist sichtbar
          end;
        COMPLEXREGION: // Region besteht aus mehr als einem Rechteck, Fenster ist teils sichtbar
          Result := vsPartVisible;
      end;
    finally
      ReleaseDC(PForm.Handle, hDC);
    end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#9

AW: Herausfinden, ob Fenster sichtbar ist

  Alt 22. Nov 2016, 17:53
Das funktioniert jetzt glücklicherweise. Zwar nicht mit dem Hauptformular, aber da brauche ich die Funktion eh nicht.

Ist ein Fenster komplett sichtbar, kommt trotzdem vsPart zurück.
Ich rufe die Funktion eine Hand voll mal auf und vergleiche immer auf <> TVisibleStatus.vsHidden. Von daher ist es egal, ob vsVisible oder vsPart.
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
542 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Herausfinden, ob Fenster sichtbar ist

  Alt 27. Dez 2016, 13:54
Schöne Sache, habe ich mir mal beiseite gelegt, kann ich bestimmt mal brauchen.

Die Frage sollte allerdings mal als "erledigt" gekennzeichnet werden.
  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 05:37 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