Maximale Fenstergröße berechnen (OpenWindow)

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von Daffy0815 »

Hallo Leute,

die Funktion "OpenWindow" hat die beiden Parameter "InnereBreite" und "InnereHoehe".

Die maximale Höhe und Breite des gesamten Desktops also "ÄußereBreite" und "ÄußereHoehe" lässt sich mit "ExamineDesktops()" gefolgt von "DesktopHeight" und "DesktopWidth" bestimmen.

Wie kann man "InnereHoehe" und "InnereBreite" so berechnen, dass das mit "OpenWindow" zu öffnende Fenster immer den maximalen Raum auf dem Desktop einnimmt?
Hierbei soll auch der Platz berücksichtigt werden den, falls vorhanden, die Taskleiste beansprucht.

Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von RSBasic »

Hm, ich weiß nicht, ob ich dich richtig verstanden habe, aber du möchtest du ein maximiertes Fenster haben oder?
Warum nutzt du nicht #PB_Window_Maximize?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von Daffy0815 »

Nun, in die Richtung habe ich auch schon gedacht!
Nur, was gebe ich dann für die beiden Parameter Höhe und Breite an?

Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von RSBasic »

Wenn dein Fenster in der Größe nicht änderbar sein soll, dann ist es egal.
Aber wenn der Benutzer die Fenstergröße jederzeit ändern kann, dann nimm irgendeine optimale Größe, die zu deinem Fensterlayout passt. Beispielsweise 500x400 oder so.
Die Gadgets, die du hast, müssen ja eh beim Resize-Event angepasst werden, von daher denk dir einfach irgendeine Größe aus.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von ts-soft »

Code: Alles auswählen

OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Maximize)

While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
Grösser braucht es nicht sein :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von Daffy0815 »

So "einfach" ist es leider nicht!
Muss jetzt erst mal was essen.
Werde später mal ein Beispiel posten.

Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von Daffy0815 »

So, nun mit Beispiel.

Ziel der Aktion soll sein ein Fenster mit Texten, Buttons etc. zu erzeugen welches unabhängig von der Größe des Desktops durch automatische Auswahl der Textgrößen und damit natürlich auch der Buttongrößen immer vollständig dargestellt wird.
Die bei vielen Programmen zu beobachtende Unart von abgeschnitten Texten oder noch schlimmer nicht mehr erreichbaren Buttons soll damit verhindert werden.

Hierzu ist natürlich die genaue Kenntnis des zur Verfügung stehenden Platzes eine Grundvoraussetzung!

Nach dem ich keinen Weg gefunden hatte diesen zu berechnen BEVOR das Fenster geöffnet wird habe ich den hier vorgeschlagenen Weg beschritten und dann versucht den Platz nach dem Öffnen des Fensters zu bestimmen.
Das funktioniert jedoch auch nicht!

Hier das Beispiel:

Code: Alles auswählen

MainWindow.i = OpenWindow(#PB_Any, 1, 1, 0, 0, "WindowName", #PB_Window_TitleBar | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_Maximize)
If MainWindow.i
  Global MaxWidth.i = WindowWidth(MainWindow.i, #PB_Window_InnerCoordinate)
  Global MaxHeight.i = WindowHeight(MainWindow.i, #PB_Window_InnerCoordinate)
  
  Debug "MaxBreite="+Str(MaxWidth.i)
  Debug "MaxHöhe="+Str(MaxHeight.i)
  
  
  Menu1.i = CreateMenu(#PB_Any, WindowID(MainWindow.i))
  If Menu1.i
    MenuTitle("Menu1")
      MenuItem(1, "Item1"   +Chr(9)+"Ctrl+O")
      MenuItem(2, "Item2"   +Chr(9)+"Ctrl+S")
      MenuItem(3, "Item3"   +Chr(9)+"Ctrl+A")
      MenuItem(4, "Item4"   +Chr(9)+"Ctrl+C")
      
    MenuTitle("Menu2")
      MenuItem(1, "Item1"   +Chr(9)+"Ctrl+O")
      MenuItem(2, "Item2"   +Chr(9)+"Ctrl+S")
      MenuItem(3, "Item3"   +Chr(9)+"Ctrl+A")
      MenuItem(4, "Item4"   +Chr(9)+"Ctrl+C")     
  EndIf

  
  
  
  
  
  
  Repeat
    Event.i = WaitWindowEvent()

    If Event.i = #PB_Event_CloseWindow
      Quit.i = 1
    EndIf

  Until Quit.i = 1
  
EndIf

End  


Da ich meinen Monitor derzeit mit 1600 X 1200 Punkten betreibe hätte ich eine Ausgabe im Debug-Fenster erwartet die so in etwa wie folgt ausgesehen hätte:

MaxBreite=1590 (1600 - 2 X Breite des Rahmens)
MaxHöhe=1080 (1200 - 2 X Breite des Rahmens - Höhe der Taskleiste - Höhe der Titelzeile)

Tatsächlich kommt aber im Beispiel

MaxBreite=1600
MaxHöhe=1151

Und das kann ja wohl (insbesondere bei der Breite) auf keinen Fall stimmen!

Hat jemand eine Idee wie man die PIXELGENAUE Freifläche innerhalb eines Fensters berechnen kann?


Gruß
Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von STARGÅTE »

Ein Maximiertes Fenster hat keinen Rahmen, das heißt der innere benutzbare Pixel ist genau bei 0 (in X-Richtung betrachtet, bei Y kommt ja noch der Titel hinzu. Das heißt, die Rückgabe stimmt schon von der Breite

Wenn dein Fenster ein Rahmen haben soll, dann zB so:

Code: Alles auswählen

Enumeration
	#Window_Fake
EndEnumeration

ExamineDesktops()

OpenWindow(#Window_Fake, 0, 0, 100, 100, "", #PB_Window_Invisible|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
Define UsableWidth.i = DesktopWidth(0) - (WindowWidth(#Window_Fake, #PB_Window_FrameCoordinate)-WindowWidth(#Window_Fake, #PB_Window_InnerCoordinate))
Define UsableHeight.i = DesktopHeight(0) - (WindowHeight(#Window_Fake, #PB_Window_FrameCoordinate)-WindowHeight(#Window_Fake, #PB_Window_InnerCoordinate))
CloseWindow(#Window_Fake)
Debug UsableWidth
Debug UsableHeight

OpenWindow(#PB_Any, 0, 0, UsableWidth, UsableHeight, "", #PB_Window_SystemMenu|#PB_Window_SizeGadget)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
1904
1042
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von Daffy0815 »

@Stargate

Danke für den Tipp.

Leider funktioniert er nur für die Breite.
Die Taskleiste wird nämlich nicht berücksichtigt.

Hier das geänderte Beispiel:

Code: Alles auswählen


Enumeration
  #WindowTest
  #WindowMain
EndEnumeration  

Enumeration
  #MenuMain
EndEnumeration  

ExamineDesktops()
OpenWindow(#WindowTest, 0, 0, 100, 100, "", #PB_Window_Invisible|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
Global MaxWidth.i = DesktopWidth(0) - (WindowWidth(#WindowTest, #PB_Window_FrameCoordinate)-WindowWidth(#WindowTest, #PB_Window_InnerCoordinate))
Global MaxHeight.i = DesktopHeight(0) - (WindowHeight(#WindowTest, #PB_Window_FrameCoordinate)-WindowHeight(#WindowTest, #PB_Window_InnerCoordinate))
CloseWindow(#WindowTest)

Debug "MaxBreite="+Str(MaxWidth.i)
Debug "MaxHöhe="+Str(MaxHeight.i)

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MaxHeight.i=MaxHeight.i-34
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

OpenWindow(#WindowMain, 0, 0, MaxWidth.i, MaxHeight.i, "WindowName", #PB_Window_TitleBar | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
 
  
CreateMenu(#MenuMain, WindowID(#WindowMain))
MenuTitle("Menu1")
  MenuItem(1, "Item1"   +Chr(9)+"Ctrl+O")
  MenuItem(2, "Item2"   +Chr(9)+"Ctrl+S")
  MenuItem(3, "Item3"   +Chr(9)+"Ctrl+A")
  MenuItem(4, "Item4"   +Chr(9)+"Ctrl+C")
  
MenuTitle("Menu2")
  MenuItem(1, "Item1"   +Chr(9)+"Ctrl+O")
  MenuItem(2, "Item2"   +Chr(9)+"Ctrl+S")
  MenuItem(3, "Item3"   +Chr(9)+"Ctrl+A")
  MenuItem(4, "Item4"   +Chr(9)+"Ctrl+C")     


  
  
  
  
  
  
Repeat
  Event.i = WaitWindowEvent()

  If Event.i = #PB_Event_CloseWindow
    Quit.i = 1
  EndIf
Until Quit.i = 1
  


End  



Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von RSBasic »

@Daffy0815
http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb

Also:

Code: Alles auswählen

;Bitte zukünftig EnableExplicit nutzen

Define TaskBarHeight
Define DesktopWorkArea.RECT

Enumeration
  #WindowTest
  #WindowMain
EndEnumeration 

Enumeration
  #MenuMain
EndEnumeration 

ExamineDesktops()
OpenWindow(#WindowTest, 0, 0, 100, 100, "", #PB_Window_Invisible|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
Global MaxWidth.i = DesktopWidth(0) - (WindowWidth(#WindowTest, #PB_Window_FrameCoordinate)-WindowWidth(#WindowTest, #PB_Window_InnerCoordinate))
Global MaxHeight.i = DesktopHeight(0) - (WindowHeight(#WindowTest, #PB_Window_FrameCoordinate)-WindowHeight(#WindowTest, #PB_Window_InnerCoordinate))
CloseWindow(#WindowTest)

Debug "MaxBreite="+Str(MaxWidth.i)
Debug "MaxHöhe="+Str(MaxHeight.i)

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
SystemParametersInfo_(#SPI_GETWORKAREA, 0, @DesktopWorkArea.RECT, 0)
TaskBarHeight = GetSystemMetrics_(#SM_CYSCREEN) - DesktopWorkArea\Bottom
MaxHeight.i=MaxHeight.i - TaskBarHeight
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

OpenWindow(#WindowMain, 0, 0, MaxWidth.i, MaxHeight.i, "WindowName", #PB_Window_TitleBar | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
 
 
CreateMenu(#MenuMain, WindowID(#WindowMain))
MenuTitle("Menu1")
  MenuItem(1, "Item1"   +Chr(9)+"Ctrl+O")
  MenuItem(2, "Item2"   +Chr(9)+"Ctrl+S")
  MenuItem(3, "Item3"   +Chr(9)+"Ctrl+A")
  MenuItem(4, "Item4"   +Chr(9)+"Ctrl+C")
 
MenuTitle("Menu2")
  MenuItem(1, "Item1"   +Chr(9)+"Ctrl+O")
  MenuItem(2, "Item2"   +Chr(9)+"Ctrl+S")
  MenuItem(3, "Item3"   +Chr(9)+"Ctrl+A")
  MenuItem(4, "Item4"   +Chr(9)+"Ctrl+C")     


 
 
 
 
 
 
Repeat
  Event.i = WaitWindowEvent()

  If Event.i = #PB_Event_CloseWindow
    Quit.i = 1
  EndIf
Until Quit.i = 1
 


End 

Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten