Rubrik: Menüs | 15.03.02 |
InsertMenuItem-Funktion Diese Funktion fügt in ein bereits Existierendem Menü einen Eintrag hinzu. | ||
Betriebssystem: Win95, Win98, WinNT 4.0, Win2000 | Views: 10.410 |
Deklaration:
Declare Function InsertMenuItem Lib "user32.dll" _ Alias "InsertMenuItemA" ( _ ByVal hMenu As Long, _ ByVal uItem As Long, _ ByVal fByPosition As Long, _ lpmii As MENUITEMINFO) As Long
Beschreibung:
Diese Funktion fügt in ein bereits Existierendem Menü einen Eintrag hinzu. Dieser Eintrag kann über einen Index an jede beliebige Stelle des Menüs eingefügt werden.
Parameter:
hMenu | Erwartet ein Menühandle einesexistierenden Menüs, in dem ein Eintrag erstellt werden soll. Ist dieses Menü ein Standardmenü eines Fensters, so erhält bei Aktivierung dieses Eintrags das Elternfenster die "WM_COMMAND"-Nachricht bzw. die "WM_SYSCOMMAND"-Nachricht, falls es sich um ein Systemmenü handelt. |
uItem | Erwartet einen existierendenMenü-ID. Der neue Eintrag wird direkt hinter diesem existierenden Menüeintrag eingefügt. DieserWert kann ein Positions-ID oder ein Menü-ID sein. |
fByPosition | Wird hier ein Wert "ungleich 0" übergeben, so wird der Menüeintrag direkt hinter demexistierenden Menüeintrag erstellt, der in "uItem" angegeben wurde. Wird hier "0" übergeben, so wird der Menüeintrag direkt an der Stelle eingefügt die in "uItem" definiert ist. |
lpmii | Erwartet eine MENUITEMINFO-Strukturdie die Eigenschaften des hinzuzufügenden Menüs enthält. |
Rückgabewert:
Ist die Funktion erfolgreich, so ist die Rückgabe "ungleich 0", andernfalls ist die Rückgabe "0". Für erweiterte Fehlerinformationen könnenSie die GetLastError-Funktion aufrufen.
Beispiel:
Private Declare Function CreatePopupMenu Lib "user32.dll" () As Long Private Declare Function DestroyMenu Lib "user32.dll" (ByVal hMenu As Long) As Long Private Declare Function InsertMenuItem Lib "user32.dll" _ Alias "InsertMenuItemA" ( _ ByVal hMenu As Long, _ ByVal uItem As Long, _ ByVal fByPosition As Long, _ lpmii As MENUITEMINFO) As Long Private Declare Function TrackPopupMenu Lib "user32.dll" ( _ ByVal hMenu As Long, _ ByVal uFlags As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal nReserved As Long, _ ByVal hwnd As Long, _ ByVal prcRect As Long) As Long Private Declare Function GetWindowRect Lib "user32.dll" ( _ ByVal hwnd As Long, _ lpRect As RECT) As Long Private Type RECT left As Long top As Long right As Long bottom As Long End Type 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 ' MENUITEMINFO fMask-Konstanten Private Const MIIM_STATE = &H1 ' benutzt die fState-Optionen Private Const MIIM_ID = &H2 ' benutzt die wID-Option Private Const MIIM_SUBMENU = &H4 ' benutzt die hSubMenu-Option Private Const MIIM_CHECKMARKS = &H8 ' benutzt die hbmpChecked- und hb,pUnchecked-Optionen Private Const MIIM_DATA = &H20 ' benutzt die dwItemDate-Option Private Const MIIM_TYPE = &H10 ' benutzt die dwTypeData-Option ' MENUITEMINFO fType-Konstanten Private Const MFT_BITMAP = &H4 ' zeigt ein Bitmap im Menü an. Das Handle des Bitmaps ' muss in dwTypeData übergeben werden und cch wird ignoriert. Kann nicht mit ' MFT_SEPARATOR oder MFT_STRING kombiniert werden Private Const MFT_MENUBARBREAK = &H20 ' platziert das Menü ein einer neuen Zeile oder ' Spalte und zeichnet über und unter dem Eintrag einen Separator Private Const MFT_MENUBREAK = &H40 ' das Gleiche wie MFT_MENUBARBREAK nur ohne Separator Private Const MFT_OWNERDRAW = &H100 ' überlässt das Neuzeichnen des Menüs dem Fenster Private Const MFT_RADIOCHECK = &H200 ' zeigt einen Radiobutton als Checked/Unchecked an Private Const MFT_RIGHTJUSTIFY = &H4000 ' richtet ein Menü rechtsbündig aus Private Const MFT_RIGHTORDER = &H2000 ' (Win 9x, 2000) Die Menüs platzieren sich ' rechts voneinander und es wird Text von rechts nach links unterstützt Private Const MFT_SEPARATOR = &H800 ' zeichnet eine horizontale Linie in den ' Menüeintrag, dwTypeData und cch werden ignoriert. Kann nicht mit MFT_BITMAP oder ' MFT_STRING kombiniert werden Private Const MFT_STRING = &H0 ' der Menüeintrag wird mit einem String gefüllt, ' deTypeData ist der String der angezeigt werden soll und cch die Länge des Strings. ' Kann nicht mit MFT_BITMAP oder MFT_SEPARATOR kombiniert werden ' MENUITEMINFO fState-Konstanten Private Const MFS_CHECKED = &H8 ' Menüeintrag ist markiert Private Const MFS_DEFAULT = &H1000 ' Menüeintrag ist die Standard-Auswahl Private Const MFS_DISABLED = &H2 ' Menüeintrag ist deaktiviert Private Const MFS_ENABLED = &H0 ' Menüeintrag ist aktiviert Private Const MFS_GRAYED = &H1 ' Menüeintrag ist grau und deaktiviert Private Const MFS_HILITE = &H80 ' Menüeintrag hat die Selektierung Private Const MFS_UNCHECKED = &H0 ' Menüeintrag ist nicht markiert Private Const MFS_UNHILITE = &H0 ' Menüeintrag hat nicht die Selektierung ' TrackPopupmenu uFlags-Konstanten Private Const TPM_CENTERALIGN = &H4 ' positioniert das Menü horizontal in der Mitte ' von x Private Const TPM_LEFTALIGN = &H0 ' positioniert das Menü horizontal mit dem linken ' Rand auf x Private Const TPM_RIGHTALIGN = &H8 ' positioniert das Menü horizontal mit dem ' rechten Rand auf x Private Const TPM_BOTTOMALIGN = &H20 ' positioniert das Menü mit dem unteren Rand ' auf y Private Const TPM_TOPALIGN = &H0 ' positioniert das Menü mit dem oberen Rand auf y Private Const TPM_VCENTERALIGN = &H10 ' positioniert das Menü vertikal in der Mitte ' von y Private Const TPM_NONOTIFY = &H80 ' sendet kein WM_COMMAND an das Elternfenster des ' Menüs bei Ereignissen Private Const TPM_RETURNCMD = &H100 ' die Funktion gibt den ID des Menüs zurück ' das gewählt wurde Private Const TPM_LEFTBUTTON = &H0 ' erlaubt dem Benutzer nur das Markieren der ' Einträge über die linke Maustaste und die Tastatur Private Const TPM_RIGHTBUTTON = &H2 ' erlaubt dem Benutzer die Einträge mit jedem ' Mausbutton und der Tastatur zu wählen Dim hPopupMenu As Long Dim Menüeintrag(1 To 2) As MENUITEMINFO
' Popupmenü anzeigen und auswerten Private Sub Command1_Click() Dim Retval As Long, Flags As Long, CmdPos As RECT ' Position des Fensters ermitteln GetWindowRect Command1.hwnd, CmdPos ' Menü anzeigen Flags = TPM_LEFTBUTTON Or TPM_TOPALIGN Or TPM_NONOTIFY Or TPM_RETURNCMD Retval = TrackPopupMenu(hPopupMenu, Flags, CmdPos.right, CmdPos.bottom, 0&, _ Me.hwnd, 0&) ' gewähltes Menü ausgeben, wenn eines gewählt wurde If Retval << 0 Then MsgBox "Sie haben auf """ & Replace(Menüeintrag(Retval).dwTypeData, "&", _ "", 1, 1) & """ gedrückt" End If End Sub
' erstellt das Popupmenü und speichert das Handle in hPopupMenu Private Sub Form_Load() Dim Retval As Long ' Popupmenü erstellen hPopupMenu = CreatePopupMenu() ' Menüeintrag hinzufügen ("&Einfügen") With Menüeintrag(1) .cbSize = Len(Menüeintrag(1)) .dwTypeData = "&Einfügen" .cch = Len(Trim$(.dwTypeData)) .fMask = MIIM_TYPE Or MIIM_ID .fState = MFS_DEFAULT Or msf_hilite .fType = MFT_STRING .wID = 1 End With Retval = InsertMenuItem(hPopupMenu, 0&, 0&, Menüeintrag(1)) If Retval = 0 Then Debug.Print "Menüeintrag konnte nicht hinzugefügt werden: (Einfügen)." End If ' Menüeintrag hinzufügen ("&Ausschneiden") With Menüeintrag(2) .cbSize = Len(Menüeintrag(2)) .dwTypeData = "&Ausschneiden" .cch = Len(Trim$(.dwTypeData)) .fMask = MIIM_TYPE Or MIIM_ID .fState = MFS_DEFAULT Or msf_hilite .fType = MFT_STRING .wID = 2 End With Retval = InsertMenuItem(hPopupMenu, 0&, 0&, Menüeintrag(2)) If Retval = 0 Then Debug.Print "Menüeintrag konnte nicht hinzugefügt werden: (Ausschneiden)." End If End Sub
' Popupmenü entfernen und Ressourcen freigeben Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) DestroyMenu hPopupMenu End Sub