MenuWidth
MenuWidth
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
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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
- NicTheQuick
- Ein Admin
- Beiträge: 8838
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: MenuWidth
Ein Menü erstreckt sich üblicherweise immer über die gesamte Fensterbreite. Deswegen gibt es keinen Befehl für die Breite.
Re: MenuWidth
@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
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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
- NicTheQuick
- Ein Admin
- Beiträge: 8838
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: MenuWidth
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
Mit GetMenuItemRect_() kann man es ermitteln.
Ich habe mal für dich was schönes gebastelt:
Ich habe zwei Funktionen geschrieben, einmal fürs Ermitteln der Breite eines MenuTitles und einmal fürs Ermitteln der Breite aller MenuTitles.
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
EndIfRe: MenuWidth
@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
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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
Re: MenuWidth
@RSBasic
Da stimmt noch etwas nicht!
Gruß
Daffy
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
EndIfDaffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert
- NicTheQuick
- Ein Admin
- Beiträge: 8838
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: MenuWidth
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.
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
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?
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
@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
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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Widerstand ist zwecklos - Sie werden emuliert

