Neue Funktionen für GuiMenu ==> ..._ColumnsCreate, ..._JustifyRight

    • 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
    [autoit]

    #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()

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlMenu_ColumnsCreate($gui, 0, 5)
    _GUICtrlMenu_ColumnsCreate($gui, 1, 10)

    [/autoit] [autoit][/autoit] [autoit]

    _GUICtrlMenu_JustifyRight($gui, 1)

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Until GUIGetMsg() = -3

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; 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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;===============================================================================
    ; 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

    [/autoit]


    Und so sieht es dann aus:

    autoit.de/wcf/attachment/5279/ autoit.de/wcf/attachment/5280/

  • Sieht super aus ;) Aber warum machst du das nicht mit Unicode ?

    [autoit]

    $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))

    [/autoit]
  • Cool danke :)

    Nur du hast 1.Fehler den ich auch gefunden habe als Anfänger :)

    Im Spoiler

    Code
    [autoit#Include <GuiMenu.au3>

    Hast du autoit nicht Zu :)

  • Toll! Aber ich kapier nicht, wie man nur 1en Teil auf die rechte Seite bringt
    MfG

    MfG. tobi_girst

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »tobi_girst« (Morgen, 25:63)

    • Offizieller Beitrag

    Aber ich kapier nicht, wie man nur 1en Teil auf die rechte Seite bringt


    Die Menüs haben in der Reihenfolge, in der du sie erstellst einen 0-basierten Index. Wenn du also das zweite Menü rechts anordnen willst, mußt du, wie im Bsp., _GUICtrlMenu_JustifyRight($gui, 1) anwenden.

  • BugFix 17. Dezember 2022 um 10:41

    Hat das Thema freigeschaltet.