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) :mrgreen:

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