[VB6] Submenus toevoegen in runtime.

Pagina: 1
Acties:
  • 313 views sinds 30-01-2008
  • Reageer

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 02-05 11:11
Ik heb een menu bar bij mijn applicatie. Ik wil in een menu een submenu toevoegen aan een in runtime toegevoegde menu.

Dus at design heb ik:
Item1 Item2 Item3 Item4 enz
|
Menu1 -->Submenu1
------------->Submenu2
------------->Submenu3

En wil bij runtime dit creeren:
Item1 Item2 Item3 Item4 enz
|
Menu1 -->Submenu1.1
------------->Submenu1.2
------------->Submenu1.3
Menu2 -->Submenu2.1
------------->Submenu2.2
------------->Submenu2.3
Menu3 -->Submenu3.1
------------->Submenu3.2
------------->Submenu3.3

Menu 2 en 3 kan ik gewoon aanmaken(menuarrays), maar hoe krijg ik die nieuwe submenu's erbij?

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 02-05 11:11
Heeft iemand enig idee?

Verwijderd

Heb geen oplossing en niet om perse utfs ofzo te roepen maar ik gebruik meestal dit forum (search vooral) om het e.e.a. te leren: http://www.xtremevbtalk.com/search.php? imo een goede start :)

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 02-05 11:11
Verwijderd schreef op zaterdag 06 augustus 2005 @ 14:55:
Heb geen oplossing en niet om perse utfs ofzo te roepen maar ik gebruik meestal dit forum (search vooral) om het e.e.a. te leren: http://www.xtremevbtalk.com/search.php? imo een goede start :)
Mmh ja, zover ik zie is het alleen mogelijk via api's? En niet normaal (kan nu jammer genoeg niks doen aangezien ik maandag pas weer aan vb6 kan).

[ Voor 33% gewijzigd door Scorpion1984 op 06-08-2005 15:15 ]


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 11:04

Robtimus

me Robtimus no like you

Als het niet anders kan is het ook mogelijk om je hele menu at design time op te bouwen en dan wat je niet gebruikt op invisible te zetten.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 02-05 11:11
IceManX schreef op zaterdag 06 augustus 2005 @ 15:54:
Als het niet anders kan is het ook mogelijk om je hele menu at design time op te bouwen en dan wat je niet gebruikt op invisible te zetten.
Dat is niet mogelijk aangezien ik onmogelijk van te voren weet hoeveel het er zijn.
De submenu items zijn elke keer het zelfde, maar hoeveel keer ik ik die menu's met submenu's heb weet ik niet van te voren(ligt aan de gebruiker van het programma in principe).

  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Je maakt een submenu item aan en je vult daarbij de Index property in, bijvoorbeeld een 0. Dan kun je vervolgens items toevoegen met:
Visual Basic:
1
2
3
Load mnuSubitem(1)
mnuSubitem(1).Caption="Aha!"
mnuSubitem(1).Visible=True

Hey, I came here to be drugged, electrocuted and probed, not insulted.


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 02-05 11:11
Haploid schreef op zaterdag 06 augustus 2005 @ 16:25:
Je maakt een submenu item aan en je vult daarbij de Index property in, bijvoorbeeld een 0. Dan kun je vervolgens items toevoegen met:
Visual Basic:
1
2
3
Load mnuSubitem(1)
mnuSubitem(1).Caption="Aha!"
mnuSubitem(1).Visible=True
Dan heb je niet wat ik bedoel.
Ik wil dit: (voorbeeld in een browser):

Afbeeldingslocatie: http://www.xs4all.nl/~pvdl1984/scrsht.jpg

Ik voeg eerst in runtime "Toolbars" toe aan "View" en vervolgens "Web Developer Toolbar" aan "Toolbars" toe

  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

Dat ondersteunt Visual Basic 6 niet. Heel simpel. Je kunt wel een mooi custom menu control downloaden van een site als http://www.codeguru.com/vb/ , maar met de standaard menu control kan wat je wil gewoon niet.

Hey, I came here to be drugged, electrocuted and probed, not insulted.


  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 10:49

ThunderNet

Flits!

Scorpion1984 schreef op zaterdag 06 augustus 2005 @ 18:18:
[...]


Dan heb je niet wat ik bedoel.
Ik wil dit: (voorbeeld in een browser):

[afbeelding]

Ik voeg eerst in runtime "Toolbars" toe aan "View" en vervolgens "Web Developer Toolbar" aan "Toolbars" toe
Dat is dus precies wat die code doet ;) er is iig genoeg te vinden op internet. en dan zul je deze code weer zien... suc6 ermee :)

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 01-05 17:37

Gerco

Professional Newbie

ThunderNet schreef op zaterdag 06 augustus 2005 @ 22:34:
Dat is dus precies wat die code doet ;) er is iig genoeg te vinden op internet. en dan zul je deze code weer zien... suc6 ermee :)
Die code kan alleen bestaande menus uitbreiden, geen hele menus erbij maken. Als je een menu hebt, kun je er met die code geen submenu bijmaken als je er geen control array voor gemaakt hebt.

Dat gaat prima zo lang de structuur en de diepte daarvan vooraf bekend zijn, maar het is onmogelijk in puur VB6 om een menustructuur te veranderen op runtime, je kan bestaande nivo's uitbreiden, maar je kunt geen dieper nivo maken.

Als je dus Menu -> Submenu hebt, zul je nooit Menu -> Submenu -> Submenu kunnen maken en dat is wat de TS wil doen.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 10:49

ThunderNet

Flits!

Gerco schreef op zaterdag 06 augustus 2005 @ 23:06:
[...]

Die code kan alleen bestaande menus uitbreiden, geen hele menus erbij maken. Als je een menu hebt, kun je er met die code geen submenu bijmaken als je er geen control array voor gemaakt hebt.

Dat gaat prima zo lang de structuur en de diepte daarvan vooraf bekend zijn, maar het is onmogelijk in puur VB6 om een menustructuur te veranderen op runtime, je kan bestaande nivo's uitbreiden, maar je kunt geen dieper nivo maken.

Als je dus Menu -> Submenu hebt, zul je nooit Menu -> Submenu -> Submenu kunnen maken en dat is wat de TS wil doen.
wat je welt kun doen is een submenu maken, en die op invisible zetten
;) en die kun je dan wel weer uit breiden dacht ik :)

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 01-05 17:37

Gerco

Professional Newbie

ThunderNet schreef op zaterdag 06 augustus 2005 @ 23:16:
wat je welt kun doen is een submenu maken, en die op invisible zetten
;) en die kun je dan wel weer uit breiden dacht ik :)
Dat kan ja, maar je kunt er dan niet nog een submenu onder hangen.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

en lukt het nu een beetje?
Anders kijk je eens naar http://www.vbaccelerator....ndBar_Control/article.asp . Kun je zo een control + extra voorbeelden downloaden. Kijk wel of je nog wat extra's moet referencen (staat ook op die site).
Anders zie ik niet zo snel in hoe je dat nu zelf zou moeten doen.

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 02-05 11:11
Heb nu met de links uit xtremevbtalks wel uitgevonden hoe ik een menuitem kan toevoegen met behulp van api. Het enige probleem is nu nog hoe ik die kliks van de gebruiker op de items nu opvang.

[ Voor 3% gewijzigd door Scorpion1984 op 08-08-2005 19:04 ]


  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

Scorpion1984 schreef op maandag 08 augustus 2005 @ 17:13:
Heb nu met de links uit xtremevbtalks wel uitgevonden hoe ik een menuitem kan toevoegen met behulp van het . Het enige probleem is nu nog hoe ik die kliks van de gebruiker op de items nu opvang.
"...behulp van het ." Wat bedoel je?
Kun je me eens een deep link geven van xtremevbtalks waar je de oplossing vandaan hebt zodat anderen er ook wat aan hebbben (waaronder ik ook misschien ;) ).

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 02-05 11:11
henkleerssen schreef op maandag 08 augustus 2005 @ 17:50:
[...]

"...behulp van het ." Wat bedoel je?
Kun je me eens een deep link geven van xtremevbtalks waar je de oplossing vandaan hebt zodat anderen er ook wat aan hebbben (waaronder ik ook misschien ;) ).
Sorry, was een tikfoutje, bedoelde met behulp van de api voor menu's.
Een kant en klare heb ik niet gevonden, maar 1 van de links is deze:
http://www.xtremevbtalk.c...t=65095&highlight=submenu

Voor de rest zal ik morgen wel wat code hierneer zetten, als ik weer op mijn werk ben en de code heb opgeschoond.

  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 02-05 11:11
Weet iemand hoe ik functies kan verbinden aan menu's die met API's zijn gemaakt?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 01-05 17:37

Gerco

Professional Newbie

Scorpion1984 schreef op dinsdag 09 augustus 2005 @ 09:05:
Weet iemand hoe ik functies kan verbinden aan menu's die met API's zijn gemaakt?
Ik ga er vanuit dat je InsertMenuItem gebruikt om je menuitems toe te voegen. In de MENUITEMINFO structure moet je een field wID opgeven. In dat veld zet je een unieke waarde voor dat menu item.

Vervolgens Subclass je je window en vang je de WM_COMMAND message. Als de hoogste 16 bits van wParam 0 zijn, vind je in de laagste 16 bits het hierboven genoemde unieke ID terug. Dan kun je dus gaan reageren op de menu actie.

Als je eenmaal bovenstaande subclassing techniek begrepen hebt, een paar keer VB hebt gecrashed en wat werk bent kwijtgeraakt, kun je hier eens naar kijken: VB+ASM Subclass. Deze is een stuk veiliger en je kunt zelfs je window procedure debuggen, scheelt een hoop frustratie.

[ Voor 27% gewijzigd door Gerco op 09-08-2005 10:05 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • Scorpion1984
  • Registratie: Juni 2002
  • Laatst online: 02-05 11:11
Heb het complete systeem in een class gezet. Ik denk dat jullie er ook wat mee kunnen.

Dit systeem is specifiek voor mijn huidige applicatie geschreven, en gaat er daarom vanuit, dat er al een menuBar bestaat met menus er in, en dat je je items wil toevoegen aan 1 van die menus. Met wat aanpassing (gewoon goed de links doorlezen en mijn code bekijken, dan lukt je dat wel), kan je dit ook anders gebruiken.

De class gebruik cSubclass.cls uit de link van Gerco (VB+ASM Subclass)

De class:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
Option Explicit

'Raised when a menu-item created with this class is clicked
Public Event menuClicked(ByVal id As Long)

'Position at the subMenu to add the items to
Private subPos As Long
'Submenu for the new items
Private hMenuTo As Long

'Last menuItem Identifier
Private nId As Long

'Subclass
Private sc As cSubclass         'Subclasser
Implements WinSubHook.iSubclass 'Subclasser interface

'API functions for menus
Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function InsertMenuItem Lib "user32" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, ByRef lpcMenuItemInfo As MENUITEMINFO) As Long
Private Declare Function CreateMenu Lib "user32" () As Long
Private Declare Function CheckMenuItem Lib "user32" (ByVal hMenu As Long, ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long

'API type for menus
Private 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

'API constant for menus
Private Const MF_STRING = &H0&
Private Const MIIM_TYPE = &H10
Private Const MIIM_ID = &H2
Private Const MIIM_SUBMENU = &H4
Private Const MF_BYCOMMAND = &H0&
Private Const MF_CHECKED = &H8&
Private Const MF_UNCHECKED = &H0&

'Initialize menu-system
Public Sub initSystem(ByVal hWnd As Long, ByVal subMenuPos As Long, ByVal addPos As Long, ByVal firstId As Long)
    'Set position at menu to add the items
    subPos = addPos
    
    'Set next identifier
    nId = firstId
    
    'Get menu
    Dim hTmp As Long
    hTmp = GetMenu(hWnd)
    hMenuTo = GetSubMenu(hTmp, subMenuPos)
    
    'Start subclass
    Call sc.Subclass(hWnd, Me)
    'Get menu clicks
    Call sc.AddMsg(WM_COMMAND, MSG_BEFORE)
End Sub

'Add a menu Item
Public Function addItem(ByVal txt As String, Optional ByVal hTo As Long = -1, Optional ByVal posTo As Long = -1) As Long
    'If not specified then add to standard Menu
    If hTo = -1 Then
        hTo = hMenuTo
    End If
    
    'If not specified then add to standard Position
    If posTo = -1 Then
        posTo = subPos
        subPos = subPos + 1
    End If
    
    Dim item As MENUITEMINFO
    
    With item
        .cbSize = Len(item)
        .fMask = MIIM_TYPE Or MIIM_ID
        .fType = MF_STRING
        .wID = nextId
        .dwTypeData = txt
        .cch = Len(.dwTypeData)
    End With
    
    addItem = item.wID
    
    Call InsertMenuItem(hTo, posTo, True, item)
End Function

'Add an empty submenu
Public Function addSubMenu(ByVal txt As String, ByRef handleOfSub As Long, Optional ByVal hTo As Long = -1, Optional ByVal posTo As Long = -1) As Long
     'If not specified then add to standard Menu
    If hTo = -1 Then
        hTo = hMenuTo
    End If
    
    'If not specified then add to standard Position
    If posTo = -1 Then
        posTo = subPos
        subPos = subPos + 1
    End If
    
    Dim hSubMenu As Long
    hSubMenu = CreateMenu
    handleOfSub = hSubMenu
    
    Dim item As MENUITEMINFO
    
    With item
        .cbSize = Len(item)
        .fMask = MIIM_TYPE Or MIIM_SUBMENU Or MIIM_ID
        .fType = MF_STRING
        .dwTypeData = txt
        .wID = nextId
        .cch = Len(.dwTypeData)
        .hSubMenu = hSubMenu
    End With
    
    addSubMenu = item.wID
    
    Call InsertMenuItem(hTo, posTo, True, item)
End Function

'Check menu item
Public Sub check(ByVal id As Long)
    Call CheckMenuItem(hMenuTo, id, MF_BYCOMMAND + MF_CHECKED)
End Sub

'Uncheck menu item
Public Sub uncheck(ByVal id As Long)
    Call CheckMenuItem(hMenuTo, id, MF_BYCOMMAND + MF_UNCHECKED)
End Sub

'Return new Id and increase id
Private Function nextId() As Long
    nextId = nId
    nId = nId + 1
End Function

'Class Initialization
Private Sub Class_Initialize()
    Set sc = New cSubclass
End Sub

'Class Termination
Private Sub Class_Terminate()
    Set sc = Nothing
End Sub

'Interface to the subclass
Private Sub iSubclass_After(lReturn As Long, ByVal hWnd As Long, ByVal uMsg As WinSubHook.eMsg, ByVal wParam As Long, ByVal lParam As Long)
    Call menuClicked("After ", lReturn, hWnd, uMsg, wParam, lParam)
End Sub

'Interface to the subclass
Private Sub iSubclass_Before(bHandled As Boolean, lReturn As Long, hWnd As Long, uMsg As WinSubHook.eMsg, wParam As Long, lParam As Long)
    Call menuClicked("Before", lReturn, hWnd, uMsg, wParam, lParam)
End Sub

'Handles messages
Private Sub menuClicked(sWhen As String, lReturn As Long, hWnd As Long, uMsg As WinSubHook.eMsg, wParam As Long, lParam As Long)
    If lParam = 0 Then 'Clicked on a menu
        RaiseEvent menuClicked(wParam)
    End If
End Sub

[ Voor 5% gewijzigd door Scorpion1984 op 09-08-2005 17:00 ]


  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

en de boel completer, handiger en speciaal voor menu gemaakt hier: http://www.planet-source-...?txtCodeId=40518&lngWId=1
Pagina: 1