Генерация динамического двух или более уровней подменю в vb6

Друзья, подскажите, как генерировать более 1 уровня подменю в VB6 во время выполнения? Объясните вкратце? Есть какие-то специальные элементы управления? Но я не хочу использовать внешние элементы управления!


person Srinivasan__    schedule 23.05.2009    source источник
comment
Если у вас есть код, дайте мне!   -  person Srinivasan__    schedule 23.05.2009


Ответы (2)


Вы можете сделать это со стандартными VB-меню, но, поскольку вам придется использовать массивы элементов управления, вы должны создать первый прототип меню с Index = 0 (например, mnuFoo(0)) во время разработки (обычно невидимым). Теперь вы можете динамически загружать новые элементы.

Call Me.Load(mnuFoo(1)) ' New array member (index 1) '
With mnuFoo(1)
    .Visible = True ' Make it visible
    ' --- Do some settings
End With
person Dario    schedule 23.05.2009
comment
Мне нужно более одного уровня меню. т.е., подменю и его подменю. Нужен полный фрагмент кода! - person Srinivasan__; 24.05.2009
comment
Хм, просто создайте свой прототип меню как подменю! - person Dario; 24.05.2009

Вы можете создать более одного уровня подменю, используя функцию API

Private Declare Function CreatePopupMenu Lib "user32" () As Long

Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hmenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long

Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Declare Function TrackPopupMenu Lib "user32" (ByVal hmenu As Long, ByVal wFlags As Long, ByVal X As Long, ByVal Y As Long, ByVal nReserved As Long, ByVal hwnd As Long, lprc As Any) As Long

Private Declare Function DestroyMenu Lib "user32" (ByVal hmenu As Long) As Long

Private Type POINTAPI
    X As Long
    Y As Long
End Type

Dim hmenu As Long, hSubMenu As Long
Private Const MF_STRING = &H0&
Private Const MF_SEPARATOR = &H800&


  hSubMenu = CreatePopupMenu
  AppendMenu hSubMenu, 0, 121, "Sub Menu1"
  AppendMenu hSubMenu, 0, 122, "Sub Menu2"

  hmenu = CreatePopupMenu
  AppendMenu hmenu, 0, 107, "Menu1"

  AppendMenu hmenu, 0, 106, "Menu2"

  AppendMenu hmenu, MF_POPUP, hSubMenu, "Menu3"
  AppendMenu hmenu, MF_POPUP, hSubMenu, "Menu4"

  AppendMenu hmenu, 0, 101, "Menu5"

Для отображения

  If Button = vbRightButton Then
    Dim P As POINTAPI
    GetCursorPos P
    TrackPopupMenu hmenu, 0, P.X, P.Y, 0, hwnd, 0

Меню не отображается до тех пор, пока не будет вызвана TrackPopupMenu. Его возвращаемое значение может указывать, какой пункт меню (если есть) был выбран. например, он может вернуть «107», если было выбрано «Меню1».

person Uma    schedule 09.08.2011
comment
Как обрабатывать его события в этом случае? - person bjan; 09.06.2014
comment
@bjan событий нет - вы просто проверяете значение TrackPopupMenu. Я отметил это в ответе. - person StayOnTarget; 05.03.2019