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:

Re: Maximale Fenstergröße berechnen (OpenWindow)

Beitrag von Daffy0815 »

Perfekt - Danke!

Code: Alles auswählen


EnableExplicit

Define TaskBarHeight, DesktopWorkArea.RECT
Define Event.i
Define Quit.i

Global MaxHeight.i, MaxWidth.i


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))
SystemParametersInfo_(#SPI_GETWORKAREA, 0, @DesktopWorkArea.RECT, 0)
TaskBarHeight = GetSystemMetrics_(#SM_CYSCREEN) - DesktopWorkArea\Bottom
MaxHeight.i=MaxHeight.i - TaskBarHeight
CloseWindow(#WindowTest)

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


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



Erstaunlich was man alles machen muss nur um herauszubekommen wie groß ein Fenster sein darf!

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 »

Sehr gut. :allright:

Weitere Tipps: Bitte immer zentral deine Variablen definieren. Also nicht mal oben und mal zwischendurch irgendwo im Code, sondern am besten alle Variablen, die du brauchst, am Anfang definieren, sonst wird es zu unübersichtlich, weil du nie weißt, ab wann eine Variable definiert wurde bzw. verfügbar ist.
Außerdem: Wenn du bestimmte Sachen hast wie "Ermitteln, wie hoch das Fenster maximal sein kann", dann am besten diese Funktion immer in einer separaten Prozedur einfügen, die du, egal wo, einfach aufrufen kannst.
Beispielsweise:

Code: Alles auswählen

Procedure GetMaxWindowWidth()
  ProcedureReturn GetSystemMetrics_(#SM_CXFULLSCREEN)-(GetSystemMetrics_(#SM_CXFRAME)*2)
EndProcedure

Procedure GetMaxWindowHeight()
  ProcedureReturn (GetSystemMetrics_(#SM_CYFULLSCREEN)-(GetSystemMetrics_(#SM_CYFRAME)*2))
EndProcedure
Diese selbst erstellten Funktionen kannst du auch in anderen Projekten wiederverwenden, ohne dass du mehrere Code-Teile (Variablendefinitionen, Ermitteln-Befehle) zusammensuchen und rüberkopieren musst.

Und nutze öfters If und Endif. Es ist erstens übersichtlicher, weil es dann eingerückt ist und zweitens kannst du besser Fehler abfangen. Wenn beispielsweise ein Fehler beim Erstellen eines Menüs entsteht (zwar unwahrscheinlich, aber es ist nur ein Beispiel), dann dann werden alle weiteren Menü-Befehle übersprungen und es kracht nicht an jeder Stelle. Also sowas wie:

Code: Alles auswählen

If 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")     
  
EndIf
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 »

@RSBasic

Das war nur ein Beispiel!

Ich maches es normalerweise noch ganz Anders:

Code: Alles auswählen

IncludeFile "#Module\$Definitionen.pbi"
;
;
IncludeFile "#Module\$Threads.pbi"
IncludeFile "#Module\$Hilfsprozeduren.pbi"
IncludeFile "#module\$Texte.pbi"
IncludeFile "#module\$Selektoren.pbi"
....
....
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 »

Dann hab ich nichts gesagt. :mrgreen:
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 »

Hier noch einmal das auf das notwendigste reduzierte Beispiel der Lösung des Problems:

Code: Alles auswählen

EnableExplicit

Define MaxHeight.i, MaxWidth.i
Define Event.i, Quit.i

Procedure GetMaxWindowWidth()
  ProcedureReturn GetSystemMetrics_(#SM_CXFULLSCREEN)-(GetSystemMetrics_(#SM_CXFRAME)*2)
EndProcedure

Procedure GetMaxWindowHeight()
  ProcedureReturn (GetSystemMetrics_(#SM_CYFULLSCREEN)-(GetSystemMetrics_(#SM_CYFRAME)*2))
EndProcedure




MaxHeight.i = GetMaxWindowHeight()
MaxWidth.i = GetMaxWindowWidth()

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


OpenWindow(#PB_Any, 0, 0, MaxWidth.i, MaxHeight.i, "Test", #PB_Window_TitleBar | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
 

 
 
Repeat
  Event.i = WaitWindowEvent()

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


End


Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Antworten