Rozdělení dlouhého menu

Postup:
Založte nový projekt, vložte do něj modul a formulář. Do formuláře připojte dvě tlačítka (cmdSplit1 a cmdSplit2) a vytvořte menu s jakýmkoliv počtem položek. Pojmenujte pole položek mnuOptions a index první položky nastavte na 0.

Nyní nadeklarujte v modulu následující:
Public Type MENUITEMINFO
    cbSize As Long
    fMask As Long
    fType As Long
    fState As Long
    wID As Long
    hSubMenu As Long
    hbmpChecked As Long
    hbmpUnchecked As Long
    dwItemData As Long
    dwTypeData As String
    cch As Long
End Type

Public Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Public Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Public Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" (ByVal hMenu As Long, ByVal un As Long, ByVal b As Boolean, lpmii As MENUITEMINFO) As Long
Public Declare Function SetMenuItemInfo Lib "user32" Alias "SetMenuItemInfoA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii As MENUITEMINFO) As Long

Public Const MIIM_STATE = &H1
Public Const MIIM_ID = &H2
Public Const MIIM_SUBMENU = &H4
Public Const MIIM_CHECKMARKS = &H8
Public Const MIIM_TYPE = &H10
Public Const MIIM_DATA = &H20
Public Const MFT_RADIOCHECK = &H200&
Public Const RGB_STARTNEWCOLUMNWITHVERTBAR = &H20&
Public Const RGB_STARTNEWCOLUMN = &H40&
Public Const RGB_EMPTY = &H100&
Public Const RGB_VERTICALBARBREAK = &H160&
Public Const RGB_SEPARATOR = &H800&
Public Const MFT_STRING = &H0&
* každá deklarace musí být celá na samostatném řádku

Do formuláře, na událost Click tlačítka cmdSplit1 vložte následující kód:
Private Sub cmdSplit1_Click()

    'Rozdělí menu před poslední položkou (mnuItemCount - 1)
    Dim r As Long
    Dim hSubMenu As Long
    Dim mnuItemCount As Long
    Dim mInfo As MENUITEMINFO

    hSubMenu = GetSubMenu(GetMenu(Me.hWnd), 0)
    mnuItemCount = GetMenuItemCount(hSubMenu)

    mInfo.cbSize = Len(mInfo)
    mInfo.fMask = MIIM_TYPE
    mInfo.fType = MFT_STRING
    mInfo.dwTypeData = Space$(256)
    mInfo.cch = Len(mInfo.dwTypeData)
    r = GetMenuItemInfo(hSubMenu, mnuItemCount - 1, True, mInfo)

    mInfo.fType = RGB_STARTNEWCOLUMNWITHVERTBAR

    mInfo.fMask = MIIM_TYPE
    r = SetMenuItemInfo(hSubMenu, mnuItemCount - 1, True, mInfo)

End Sub

Do formuláře, na událost Click tlačítka cmdSplit2 vložte následující kód:
Private Sub cmdSplit2_Click()

    'Rozdělí menu do dvou stejných sloupců
    Dim r As Long
    Dim hSubMenu As Long
    Dim mnuItemCount As Long
    Dim mInfo As MENUITEMINFO
    Dim pad As Long

    hSubMenu = GetSubMenu(GetMenu(Me.hWnd), 0)
    mnuItemCount = GetMenuItemCount(hSubMenu)

    mnuItemCount Mod 2 <> 0 Then pad = 1

    mInfo.cbSize = Len(mInfo)
    mInfo.fMask = MIIM_TYPE
    mInfo.fType = MFT_STRING
    mInfo.dwTypeData = Space$(256)
    mInfo.cch = Len(mInfo.dwTypeData)
    r = GetMenuItemInfo(hSubMenu, (mnuItemCount \ 2) + pad, True, mInfo)

    mInfo.fType = RGB_STARTNEWCOLUMNWITHVERTBAR
    mInfo.fMask = MIIM_TYPE
    r = SetMenuItemInfo(hSubMenu, (mnuItemCount \ 2) + pad, True, mInfo)

End Sub

Zpět

Autor: The Bozena