- Offizieller Beitrag
Hi,
wenn ihr mal sehr viele Menüpunkte unterbringen müßt, ist es übersichtlicher diese in Spalten anzuordnen.
Da diese Funktion in der GuiMenu.au3 nicht enthalten ist, habe ich sie mal erstellt.
Edit:
Habe grad noch erweitert um die Möglichkeit, Menüpunkte rechts im Fenster anzuordnen.
Anwendung s. Bsp. bzw. Angaben im Funktionskopf:
Spoiler anzeigen
#Include <GuiMenu.au3>
[/autoit] [autoit][/autoit] [autoit]$gui = GUICreate('Test')
$mnu1 = GUICtrlCreateMenu('Mainmenü 1')
For $i = 1 To 20
GUICtrlCreateMenuItem('SubMenü_' & $i, $mnu1)
Next
$mnu2 = GUICtrlCreateMenu('Mainmenü 2')
For $i = 1 To 20
GUICtrlCreateMenuItem('SubMenü_' & $i, $mnu2)
Next
GUISetState()
_GUICtrlMenu_ColumnsCreate($gui, 0, 5)
_GUICtrlMenu_ColumnsCreate($gui, 1, 10)
_GUICtrlMenu_JustifyRight($gui, 1)
[/autoit] [autoit][/autoit] [autoit]Do
Until GUIGetMsg() = -3
;===============================================================================
; Function Name: _GUICtrlMenu_JustifyRight($hWnd, $iMnuIndex)
; Description:: Das MenüItem wird rechts im Fenster positioniert
; Parameter(s): $hWnd - Fenster ID
; $iMnuIndex - 0-Index des gewünschten Menüs
; Requirement(s): #Include <GuiMenu.au3>
; Return Value(s): Erfolg - 1
; Fehler - 0
; @error: 1= Fenster enthält kein Menü
; 2= $iMnuIndex außerhalb des Indexbereiches
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _GUICtrlMenu_JustifyRight($hWnd, $iMnuIndex)
Dim $hMenu, $mnuID, $mnuItemText, $buffer
$hMenu = _GUICtrlMenu_GetMenu($hWnd)
If Not $hMenu Then Return SetError(1,0,0)
If ($iMnuIndex+1 > _GUICtrlMenu_GetItemCount($hMenu)) Or ($iMnuIndex < 0) Then Return SetError(2,0,0)
$mnuID = _GUICtrlMenu_GetItemID($hMenu, $iMnuIndex)
$mnuItemText = _GUICtrlMenu_GetItemText($hMenu, $iMnuIndex)
$buffer = DllStructCreate('wchar[' & StringLen($mnuItemText)+1 & ']')
DllStructSetData($buffer, 1, $mnuItemText)
DllCall("user32", 'long', "ModifyMenuW", 'long', $hMenu, 'long', $mnuID, _
'long', $MF_RIGHTJUSTIFY, 'long', $mnuID, 'ptr', DllStructGetPtr($buffer))
DllCall("user32", 'long', 'DrawMenuBar', 'long', $hWnd)
Return 1
EndFunc ;<==_GUICtrlMenu_JustifyRight
;===============================================================================
; Function Name: _GUICtrlMenu_ColumnsCreate($gui, $iMnuIndex, $ItemInCol=0)
; Description:: Listet MenüItem spaltenförmig auf
; Parameter(s): $gui - Fenster ID
; $iMnuIndex - 0-Index des gewünschten Menüs
; $ItemInCol - Anzahl der Item in einer Spalte
; Requirement(s): #Include <GuiMenu.au3>
; Return Value(s): Erfolg - 1
; Fehler - 0
; @error: 1= Fenster enthält kein Menü
; 2= $iMnuIndex außerhalb des Indexbereiches
; 3= Menü enthält weniger Item als je Spalte gelistet werden sollen
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _GUICtrlMenu_ColumnsCreate($gui, $iMnuIndex, $ItemInCol=0)
Local $hMenu, $hSubMenu, $buffer
Local $mnuItemCnt, $mnuItemID, $mnuItemText
Local $Mode, $count = 0
$hMenu = _GUICtrlMenu_GetMenu($gui)
If Not $hMenu Then Return SetError(1,0,0)
If ($iMnuIndex+1 > _GUICtrlMenu_GetItemCount($hMenu)) Or ($iMnuIndex < 0) Then Return SetError(2,0,0)
$hSubMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, $iMnuIndex)
If BitAND(_GUICtrlMenu_GetItemState($hMenu, $hSubMenu), 1) Then
$Mode = $MF_MENUBARBREAK
Else
$Mode = $MF_MENUBREAK
EndIf
$mnuItemCnt = _GUICtrlMenu_GetItemCount($hSubMenu)
If $mnuItemCnt <= $ItemInCol Then
Return SetError(3,0,0)
EndIf
For $i = 1 To $mnuItemCnt
If ($i > 1) And (Not Mod($i-1, $ItemInCol)) Then
$mnuItemText = _GUICtrlMenu_GetItemText($hSubMenu, $i-1)
$mnuItemID = _GUICtrlMenu_GetItemID($hSubMenu, $i-1)
$buffer = DllStructCreate('wchar[' & StringLen($mnuItemText)+1 & ']')
DllStructSetData($buffer, 1, $mnuItemText)
DllCall("user32", 'long', "ModifyMenuW", 'long', $hSubMenu, 'long', $i-1, _
'long', BitOR($MF_BYPOSITION, $Mode), 'long', $mnuItemID, 'ptr', DllStructGetPtr($buffer))
EndIf
Next
Return 1
EndFunc ;<==_GUICtrlMenu_ColumnsCreate
Und so sieht es dann aus:
autoit.de/wcf/attachment/5279/ autoit.de/wcf/attachment/5280/