Seite 1 von 2
MenuWidth
Verfasst: 24.07.2013 14:08
von Daffy0815
Hallo Leute,
Wie ich in der Befehlsreferenz nachlesen konnte gibt es einen Befehl namens "MenuHeight" der die Höhe der Titelzeile eines Menüs zurückgibt.
Einen Befehl der die Breite der Titelzeile eines Menüs zurückgibt habe ich jedoch nicht gefunden.
Gibt es den nicht oder habe ich da etwas übersehen?
Gruß
Daffy
Re: MenuWidth
Verfasst: 24.07.2013 14:19
von NicTheQuick
Ein Menü erstreckt sich üblicherweise immer über die gesamte Fensterbreite. Deswegen gibt es keinen Befehl für die Breite.
Re: MenuWidth
Verfasst: 24.07.2013 14:39
von Daffy0815
@NickTheQuick
Ich glaube hier liegt ein Missverständnis vor!
Ich rede von der Titelzeile eines Menüs.
So wie bei der PureBasicIDE
Datei | Bearbeiten | Projekt | Form | Compiler | Debugger | Hilfe |
Das erstreckt sich doch nicht über die gesamte Fensterbreite.
Gruß
Daffy
Re: MenuWidth
Verfasst: 24.07.2013 14:53
von NicTheQuick
Man kann mit der API
GetMenuBarInfo_() anscheinend Position und Größe eines Menüs bekommen. Aber da ich es selbst nicht ausprobieren kann und es auch nicht näher beschrieben ist, weiß ich nicht, ob du da tatsächlich die Breite bekommst, die die Menübuttons einnehmen oder ob die Breite einfach die Fensterbreite ist. Womöglich bietet Windows das nicht so direkt an, aber wer weiß.
Re: MenuWidth
Verfasst: 24.07.2013 15:33
von RSBasic
Mit GetMenuItemRect_() kann man es ermitteln.
Ich habe mal für dich was schönes gebastelt:
Code: Alles auswählen
EnableExplicit
Procedure GetMenuTitleWidth(WindowID, MenuID, MenuTitleID)
Protected WINRECT.RECT
Protected MENURECT.RECT
Protected MenuTitleX
Protected MenuTitleWidth
GetWindowRect_(WindowID, WINRECT)
GetMenuItemRect_(WindowID, MenuID, MenuTitleID, MENURECT)
MenuTitleX = MENURECT\left - WINRECT\left
MenuTitleWidth = MENURECT\Right-MENURECT\Left
ProcedureReturn MenuTitleWidth
EndProcedure
Procedure GetFullMenuTitleWidth(WindowID, MenuID)
Protected a
Protected MenuTitleTotal
Protected MenuTitleWidthTotal
MenuTitleTotal = GetMenuItemCount_(MenuID)-1
For a=0 To MenuTitleTotal
MenuTitleWidthTotal + GetMenuTitleWidth(WindowID, MenuID, a)
Next
ProcedureReturn MenuTitleWidthTotal
EndProcedure
If OpenWindow(0, 0, 0, 500, 250, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateMenu(0,WindowID(0))
MenuTitle("Datei");0
MenuTitle("Bearbeiten");1
MenuTitle("Hilfe");2
EndIf
Debug "Breite von MenuTitle ''Datei'': " + GetMenuTitleWidth(WindowID(0), MenuID(0), 0)
Debug "Breite aller MenuTitles: " + GetFullMenuTitleWidth(WindowID(0), MenuID(0))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Ich habe zwei Funktionen geschrieben, einmal fürs Ermitteln der Breite
eines MenuTitles und einmal fürs Ermitteln der Breite
aller MenuTitles.
Re: MenuWidth
Verfasst: 24.07.2013 22:36
von Daffy0815
@RSBasic
Danke für die Routinen!
Bin noch am Testen im Gesamtzusammenhang.
Da bekommt man graue Haare dabei!
Die Leute die sich Windows ausgedacht haben gehören geschlagen!
Gruß
Daffy
Re: MenuWidth
Verfasst: 24.07.2013 23:30
von Daffy0815
@RSBasic
Da stimmt noch etwas nicht!
Code: Alles auswählen
EnableExplicit
Procedure GetMenuTitleWidth(WindowID, MenuID, MenuTitleID)
Protected WINRECT.RECT
Protected MENURECT.RECT
Protected MenuTitleX
Protected MenuTitleWidth
GetWindowRect_(WindowID, WINRECT) ;HIER WAR EIN FEHLER
GetMenuItemRect_(WindowID, MenuID, MenuTitleID, MENURECT)
MenuTitleX = MENURECT\left - WINRECT\left
MenuTitleWidth = MENURECT\Right-MENURECT\Left
ProcedureReturn MenuTitleWidth
EndProcedure
Procedure GetFullMenuTitleWidth(WindowID, MenuID)
Protected a
Protected MenuTitleTotal
Protected MenuTitleWidthTotal
MenuTitleTotal = GetMenuItemCount_(MenuID)-1
For a=0 To MenuTitleTotal
MenuTitleWidthTotal + GetMenuTitleWidth(WindowID, MenuID, a)
Next
ProcedureReturn MenuTitleWidthTotal
EndProcedure
If OpenWindow(0, 0, 0, 500, 250, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If CreateMenu(0,WindowID(0))
MenuTitle("Datei");0
MenuTitle("Bearbeiten");1
MenuTitle("Hilfe");2
EndIf
ResizeWindow(0,#PB_Ignore,#PB_Ignore, GetFullMenuTitleWidth(WindowID(0), MenuID(0)), #PB_Ignore) ;Hieran kann man sehen das in der Breitenberechnung noch was fehlt
Debug "Breite von MenuTitle ''Datei'': " + GetMenuTitleWidth(WindowID(0), MenuID(0), 0)
Debug "Breite aller MenuTitles: " + GetFullMenuTitleWidth(WindowID(0), MenuID(0))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Gruß
Daffy
Re: MenuWidth
Verfasst: 24.07.2013 23:36
von NicTheQuick
Ich rate mal blind. Hast du mal versucht eine 'While WindowEvent() : Wend"-Schleife vor das Resize zu setzen, damit erst mal alle Events abgearbeitet werden können? Eventuell müssen nach dem Erstellen des Menüs noch ein paar Events von internen Callbacks abgearbeitet werden, die dann erst die endgültige Größe des Menüs "berechnen" und somit verfügbar machen.
Oder verschiebe die beiden Debug-Zeilen mal hinter die "Repeat : Until"-Schleife und beende das Programm. Kommen dann andere Werte raus?
Falls das alles nichts ändert, kommen vermutlich zu den einzelnen Menübreiten noch irgendwelche Abstände, die links und rechts immer sind und noch dazu gerechnet werden müssen.
Re: MenuWidth
Verfasst: 24.07.2013 23:37
von RSBasic
Ja das stimmt. Die zurückgegebene Breite ist zwar korrekt, aber er bricht schon vorher um, weil rechts noch ein Margin vorhanden ist.
Wenn du stattdessen folgende Zeile nehmen würdest, würde es bei dir dann passen?
Code: Alles auswählen
ResizeWindow(0,#PB_Ignore,#PB_Ignore, GetFullMenuTitleWidth(WindowID(0), MenuID(0))+8, #PB_Ignore)
Re: MenuWidth
Verfasst: 24.07.2013 23:53
von Daffy0815
@RSBasic
Das mit den +7 ist keine Lösung!
Ändere mal die Schriftgröße für die Menüs in der Systemsteuerung von 8 auf 24 und schau Dir an was dann passiert.
Ist sehe das eher so wie NickTheQuick.
Da werden bestimmt noch Abstände zwischen den Menübuttons eingebaut.
Gruß
Daffy