popup menu

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

popup menu

Сообщение 13GHOST » 02.05.2006 (Вт) 21:25

Как в меню, созданное при помощи menu editor, програмно добавить подпункт меню? Заранее спасибо за ответ...

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 02.05.2006 (Вт) 21:55

Форма:

Код: Выделить всё
Option Explicit

Private Sub Form_Load()
   Dim mnuString As MENUITEMINFO
   Dim mnuSeparator As MENUITEMINFO
   
       mnuString.cbSize = Len(mnuString)
       mnuString.fMask = MIIM_STRING Or MIIM_ID
       mnuString.fType = MFT_STRING
       mnuString.dwTypeData = "&About"
       mnuString.wID = UDC_ABOUTMNU
       
       InsertMenuItem GetMenu(Me.hwnd), GetMenuItemCount(GetMenu(Me.hwnd)) + 1, True, mnuString
       ChangeWindowProc
End Sub


Модуль:
Код: Выделить всё
Option Explicit

   Public Declare Function GetMenu Lib "user32.dll" (ByVal hwnd As Long) As Long
   Public Declare Function GetSystemMenu Lib "user32.dll" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
   Public Declare Function InsertMenuItem Lib "user32.dll" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, ByRef lpcMenuItemInfo As MENUITEMINFO) As Long
   Public Declare Function GetMenuItemCount Lib "user32.dll" (ByVal hMenu As Long) As Long
   
   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 Const MF_STRING As Long = &H0&
   Public Const MIIM_ID As Long = &H2
   Public Const MIIM_STRING As Long = &H40
   Public Const MFT_SEPARATOR = &H800
   Public Const MFT_STRING = &H0

   Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
   Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
   Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   
   Public Const GWL_WNDPROC = (-4)
   
   Public Const UDC_ABOUTMNU As Long = 1

   Global OldWndProc As Long

Public Sub ChangeWindowProc()
   OldWndProc = SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Function WindowProc(ByVal hw As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Debug.Print msg
   WindowProc = CallWindowProc(OldWndProc, hw, msg, wParam, lParam)
End Function
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 03.05.2006 (Ср) 7:29

Этот код добавляет пункт меню, а как добавить подпункт, например в пункт файл нужно еще засунуть несколько подпунктов...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.05.2006 (Ср) 10:50

Для этого стоит воспользоваться функцией GetSubMenu. Т.е. порядок такой:

1. Получаешь дескриптор меню формы при помощи GetMenu
2. Получаешь дескриптор подменю при помощи GetSubMenu
3. Дальнейшие действия как в примере - функцией InsertMenuItem lдобавляешь нужный пункт в полученное подменю
Весь мир матрица, а мы в нем потоки байтов!

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 03.05.2006 (Ср) 14:29

все разобрался... добавить то добавил... а как теперь реализовать событие, когда по этому пункту кликнули?

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 03.05.2006 (Ср) 14:42

сравнивай wParam c UDC_ABOUTMNU, ток вот какой msg ловить, так и не разобралсо (
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

13GHOST
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 305
Зарегистрирован: 09.01.2004 (Пт) 12:48

Сообщение 13GHOST » 03.05.2006 (Ср) 14:54

блин а чо все так трудно?? подругому вообще никак??

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 03.05.2006 (Ср) 15:00

Надо ловить сообщение WM_COMMAND

З.Ы. А кому щас легко?
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 116

    TopList