MenuWidth

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

MenuWidth

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
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

Beitrag von NicTheQuick »

Ein Menü erstreckt sich üblicherweise immer über die gesamte Fensterbreite. Deswegen gibt es keinen Befehl für die Breite.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: MenuWidth

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
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

Beitrag 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ß.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: MenuWidth

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: MenuWidth

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: MenuWidth

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
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

Beitrag 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.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: MenuWidth

Beitrag 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)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: MenuWidth

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Antworten