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