|
|
Hans Happel
Dass Untermenü-Einträge untereinander stehen ist ja ganz praktisch, aber wenn's
zu viele werden ist eine Tabelle besser. Geben Sie ihrem Programm eine
besondere Note und stellen Sie die Menüpunkte nebeneinander oder als Tabelle
dar.
Das folgende Programm erstellt eine Tabelle mit drei Spalten.
Beachten Sie, dass das Checked-Symbol in den äußeren Spalten als Punkt und in
der inneren Spalte als Haken dargestellt wird.
-
Erstellen Sie eine Form
-
Fügen Sie mit dem Editor einen Menüeintrag ein.
-
Fügen Sie einen Untereintrag ein.
-
Geben Sie dem Untereintrag den Namen mnuTabelle.
-
Der Untereintrag muss den Index 0 haben.
Der Deklarationsabschnitt sollte so aussehen:
Option Explicit
'Schriftarten
Const MF_BYCOMMAND = 0
Const MF_BITMAP = 4
Const MF_CHECKED = 8
Private Declare Function GetMenu Lib "User32" (ByVal hWnd As Long) As Long
Private Declare Function GetSubMenu Lib "User32" (ByVal hWnd As Long, ByVal
nPos As Long) As Long
'Checkpunkt
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
Private Declare Function SetMenuItemInfo Lib "User32" Alias "SetMenuItemInfoA"
(ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii As
MENUITEMINFO) As Long
Private Const MIIM_TYPE = &H10
Private Const HC = &H0 'Checked als Haken
Private Const RC = &H200 'Checked als Punkt
Private Const MB = &H20 'Senkrechte Trennung und seitliche Verschiebung
Erstellen Sie folgende Funktion:
Private Function CheckPunkt(Mnu As Menu, ByVal FType As Long, ByVal BarPos As
Long, ByVal MenuPos As Long)
Dim M As MENUITEMINFO
Dim hMenu As Long
Static n As Integer
hMenu = GetSubMenu(GetMenu(Mnu.Parent.hWnd), BarPos)
M.cbSize = Len(M)
M.fMask = MIIM_TYPE
M.FType = FType 'MFT_RADIOCHECK
M.fState = 0
M.wID =
0
M.hSubMenu = 0
M.hbmpChecked = 0
M.hbmpUnchecked = 0
M.dwItemData = 0
M.dwTypeData = mnuTabelle(MenuPos).Caption & Chr$(0)
n = n + 1
M.cch = 0
SetMenuItemInfo hMenu, MenuPos, 1, M
End Function
|
So sieht das Form_Load-Ereignis aus:
Private Sub Form_Load()
Dim I As Integer
For I = 1 To 17
Load mnuTabelle(I)
mnuTabelle(I).Caption = I + 1 & ". Eintrag"
mnuTabelle(I).Checked =
False
Next
For I = 0 To 5
CheckPunkt mnuTabelle(0), RC, 0, I
Next
CheckPunkt mnuTabelle(6), HC + MB, 0, 6
For I = 7 To 11
CheckPunkt mnuTabelle(0), HC, 0, I
Next
CheckPunkt mnuTabelle(12), RC + MB, 0, 12
For I = 13 To 17
CheckPunkt mnuTabelle(0), RC, 0, I
Next
End Sub |
Den Inhalt der ersten For-Next-Schleife können Sie auch mit dem
Menu-Editor
eingeben. In diesem Falle muss der Index in fortlaufender Reihenfolge sein.
Das mnuTabelle_Click-Ereignis kann so aussehen:
Private Sub mnuTabelle_Click(Index As Integer)
Dim I As Integer
For I = 0 To 17
mnuTabelle(I).Checked = False
Next I
mnuTabelle(Index).Checked = True
MsgBox "Sie haben " & mnuTabelle(Index).Caption & " gewählt !", , "Ihre
Wahl"
End Sub |
|
|