Seite 2 von 2
Re: MenuWidth
Verfasst: 25.07.2013 00:04
von Daffy0815
Da diese Abstände ja wahrscheinlich zu den "Geheimnissen" des MS-Murkses gehören gibt es noch eine "Quick and Dirty-Lösung"
"ProcedureReturn MenuTitleWidth * 1.03"
MS-DOS hieß ja auch mal QDOS ([Q]uick and [D]irty [O]perating [S]ystem)
Gruß
Daffy
Re: MenuWidth
Verfasst: 25.07.2013 00:15
von RSBasic
Daffy0815 hat geschrieben:Ist sehe das eher so wie NickTheQuick.
Da werden bestimmt noch Abstände zwischen den Menübuttons eingebaut.
Das kann aber nicht sein, weil die Zwischenabstände (Item-Anfang bis Item-Ende = Vollständige Breite des MenuItems) des MenuTitle in der RECT-Struktur mit einberechnet wurden.
Du kannst das leicht prüfen. Drücke Alt + Druck, um dein Fenster zu fotografieren, und mess selber in einem Bildbearbeitungsprogramm aus, dann siehst du, dass die RECT-Positionen und -Größen stimmen.
Das einzige was fehlt, ist wie gesagt der Abstand (zwischen Ende des letzten MeniItems und "Ende" der Menüzeile) am Ende, um das Umbrechen der Menüzeile zu verhindern!
Re: MenuWidth
Verfasst: 25.07.2013 17:39
von Daffy0815
@RSBasic
Möglich, nur wenn dem so ist, wie kommt man dann an die Größe dieses Abstands?
Gruß
Daffy
Re: MenuWidth
Verfasst: 25.07.2013 18:36
von Daffy0815
Also, es ist tatsächlich nur ein am Ende der letzten Menüschaltfläche eingefügter Leeraum.
Dieser steht in Zusammenhang mit der verwendeten Schrifthöhe.
Durch schrittweise Näherung habe ich ein Faktor für MenuWidthTotal gefunden den ich mit verschiedenen Schriftarten zwischen 8 und 24 Punkt getestet habe.
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 * 1.05834
EndProcedure
If OpenWindow(0, 0, 0, 400, 70, "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 von MenuTitle ''Bearbeiten'': " + GetMenuTitleWidth(WindowID(0), MenuID(0), 1)
Debug "Breite von MenuTitle ''Hilfe'': " + GetMenuTitleWidth(WindowID(0), MenuID(0), 2)
Debug "Breite aller MenuTitles: " + GetFullMenuTitleWidth(WindowID(0), MenuID(0))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Gruß
Daffy