Fensterzentrierung

Anfängerfragen zum Programmieren mit PureBasic.
Salafat
Beiträge: 30
Registriert: 05.01.2012 07:40
Computerausstattung: AMD FX-8350 Eight-Core-Prozessor 4,00 GHz
8 GB RAM
Windows 7 64-Bit
Wohnort: Berlin

Fensterzentrierung

Beitrag von Salafat »

Fensterzentrierung

Hallo,

mein Programm verfügt über ein Hauptfenster und mehrere Unterfenster, und eines davon hat seinerseits Unterfenster. Ich will, daß das Hauptfenster (dessen übergeordnetes Fenster der Desktop ist) in der Mitte des Desktops erscheint, die Unterfenster aber in der Mitte ihrer übergeordneten Fenster.

Nun dachte ich, ich greife einfach den Befehl GetActiveWindow() zurück und sage z.B.

Code: Alles auswählen

bF=WindowID(GetActiveWindow())  ; beherbergendes Fenster

K(0)=OpenWindow(#PB_Any, 0, 0, Br, H, "Lerninhalte", #PB_Window_SystemMenu|
    #PB_Window_WindowCentered, bF)
Das funktioniert auch bei den Unterfenstern, nicht aber beim Hauptfenster. Ich ging davon aus, daß GetActiveWindow() einfach -1 oder irgendwiesowas zurückgibt, wenn das aktive Fenster der Desktop ist. Aber nein, PB wirft eine Fehlermeldung raus ("Fenster nicht initialisiert").

Nun ist es natürlich kein Problem, anstelle von #PB_Window_WindowCentered einfach #PB_Window_ScreenCentered zu sagen. Was aber, wenn man eine Prozedur zur automatischen Erstellung von Fenstern mit ListViews geschrieben hat, die sowohl dann funktionieren soll, wenn es kein übergeordnetes Fenster gibt (also das Hauptfenster erstellt wird), als auch dann, wenn es sich um ein Unterfenster handelt?

Genauer gefragt: Wie kriegt man heraus, ob bereits ein aktives Fenster existiert, oder kein aktives Fenster existiert bzw. der Desktop das aktive Fenster ist?

Vielen Dank
PureBasic v5.11 x64
Windows 7 64-Bit
AMD FX-8350 Eight-Core Processor 4 GHz, 8 GB Arbeitsspeicher
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Fensterzentrierung

Beitrag von NicTheQuick »

Wie wäre es mit einem einfachen If?

Code: Alles auswählen

Define.i flags = #PB_Window_SystemMenu
Define.i hParent = 0

If (GetActiveWindow() >= 0)
	flags | #PB_Window_WindowCentered
	hParent = WindowID(GetActiveWindow())
Else
	flags | #PB_Window_ScreenCentered
EndIf

Debug OpenWindow(#PB_Any, 0, 0, Br, H, "Lerninhalte", flags, hParent) 
Salafat
Beiträge: 30
Registriert: 05.01.2012 07:40
Computerausstattung: AMD FX-8350 Eight-Core-Prozessor 4,00 GHz
8 GB RAM
Windows 7 64-Bit
Wohnort: Berlin

Re: Fensterzentrierung

Beitrag von Salafat »

Hallo NicTheQuick,

wie sich herausstellt, habe ich einfach nicht genug debuggt: WindowID(GetActiveWindow()) gibt ja tatsächlich -1 zurück, wenn es kein übergeordnetes Fenster gibt – genauso, wie ich es erwartet (aber nicht nachgeprüft) hatte. Nur darf man eben WindowID(GetActiveWindow()) dann nicht an die Stelle des flags-Parameters setzen, wenn das Ergebnis von GetActiveWindow() = -1 ist.

Wieso eigentlich nicht? WindowID(GetActiveWindow()) müßte doch einfach das Handle des Desktops (also 0) zurückgeben, wenn es kein aktives Fenster gibt. Wieso löst das eine Fehlermeldung aus?
PureBasic v5.11 x64
Windows 7 64-Bit
AMD FX-8350 Eight-Core Processor 4 GHz, 8 GB Arbeitsspeicher
Antworten