MenuWidth

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

Re: MenuWidth

Beitrag 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
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: MenuWidth

Beitrag 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!
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

Möglich, nur wenn dem so ist, wie kommt man dann an die Größe dieses Abstands?

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 »

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