[WinAPI] Fensterzustände

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

[WinAPI] Fensterzustände

Beitrag von Krishty »

Hi,

Ich bin gerade ziemlich durcheinander was die Zustände eines Anwendungsfensters angeht. So wie ich das sehe, geschieht die Verwaltung auf mehrere Arten:
  • Es gibt einen Eingabezustand. Der entscheidet vor allem, ob ein Fenster den Eingabefokus hat oder nicht (aktiv / inaktiv?).
  • Es gibt den Anzeigezustand. Der entscheidet, ob das Fenster minimiert, maximiert, sichtbar, oder unsichtbar ist.
Die beiden überlappen sich: Ein Fenster kann maximiert sein, aber nicht aktiv (z.B., weil der Eingabefokus auf der Task-Leiste liegt). Es kann aber wohl auch aktiv sein, obwohl unsichtbar(?).

Könntet ihr mir auf die Sprünge helfen, ob ich mit dieser Einordnung halbwegs richtig liege, und ob es da noch mehr Konzepte gibt?

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
odenter
Establishment
Beiträge: 207
Registriert: 26.02.2009, 11:58

Re: [WinAPI] Fensterzustände

Beitrag von odenter »

Ja ein Fenster kann aktiv (Eingabefocus) sein, obwohl man es nicht als "Fenster" auf dem Desktop sieht.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: [WinAPI] Fensterzustände

Beitrag von BeRsErKeR »

Prinzipiell ist auch die Z-Order noch entscheidend (siehe SetWindowPos).
Ohne Input kein Output.
Benutzeravatar
Krishty
Establishment
Beiträge: 8268
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [WinAPI] Fensterzustände

Beitrag von Krishty »

Kleine Aktualisierung: Der dritte Zustand ist, ob das Fenster aktiv (bzw., global gesehen, das Vordergrundfenster) ist. BeRsErKeR, ich weiß nicht, ob das ist, was du meintest.

Dieser Zustand ist minimal mit dem Eingabezustand (im WinAPI-Jargon wohl Focus genannt) verschränkt, in dem Sinne, dass jedes Fenster, das den Eingabefokus hat, entweder selber aktiv oder das Kind eines aktiven Fensters ist. Mehr haben die beiden aber dann schon nicht mehr gemein. Persönlich habe ich es also im Augenblick folgendermaßen aufgeschlüsselt:
  • enum { visible, maximized, minimized, invisible } showState;
    bestimmbar durch IsWindowVisible(), IsZoomed(), und IsIconic()
  • bool isActive;
    bestimmbar durch GetActiveWindow()
    ändert bei WM_ACTIVATE und WM_MOUSEACTIVATE
  • bool hasFocus;
    bestimmbar durch GetFocus()
    andert bei WM_SETFOCUS und WM_KILLFOCUS
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten