Das nachfolgende Beispiel zeigt, wie sich ein PopUp-Menu zur Laufzeit per Windows-API erstellen und anzeigen lässt. ' zunächst alle benötigten API-Deklarationen Public Declare Function CreatePopupMenu Lib "user32.dll" () As Long Public Declare Function DestroyMenu Lib "user32.dll" ( _ ByVal hMenu As Long) As Long Public 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 Public 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 Public Declare Function GetWindowRect Lib "user32.dll" ( _ ByVal hwnd As Long, _ lpRect As RECT) As Long Public Type RECT left As Long top As Long right As Long bottom As Long End Type 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 ' MENUITEMINFO fMask-Konstanten ' ============================= ' Benutzt die fState Optionen Public Const MIIM_STATE = &H1 ' Benutzt die wID Option Public Const MIIM_ID = &H2 ' Benutzt die hSubMenu Option Public Const MIIM_SUBMENU = &H4 ' Benutzt die hbmpChecked und hbmpUnchecked Optionen Public Const MIIM_CHECKMARKS = &H8 ' Benutzt die dwItemDate Option Public Const MIIM_DATA = &H20 ' Benutzt die dwTypeData Option Public Const MIIM_TYPE = &H10 ' MENUITEMINFO fType-Konstanten ' ============================= ' Zeigt ein Bitmap im Menü an. Der Handle des Bitmaps muss in ' dwTypeData übergeben werden und cch wird ignoriert. ' Kann nicht mit MFT_SEPARATOR oder MFT_STRING kombiniert ' werden. Public Const MFT_BITMAP = &H4 ' Plaziert das Menü in eine neuen Zeile oder Spalte und ' zeichnet über und unter dem Eintrag einen Separator Public Const MFT_MENUBARBREAK = &H20 ' Identisch mit MFT_MENUBARBREAK nur ohne Separator Public Const MFT_MENUBREAK = &H40 ' Überlässt das Neuzeichnen des Menüs dem Fenster Public Const MFT_OWNERDRAW = &H100 ' Zeigt einen Radiobutton als Checked/Unchecked an Public Const MFT_RADIOCHECK = &H200 ' Richtet ein Menü rechtsbündig aus Public Const MFT_RIGHTJUSTIFY = &H4000 ' (Win 9x, 2000) Die Menüs plazieren sich rechts voneinander, ' der Text von rechts nach links unterstützt Public Const MFT_RIGHTORDER = &H2000 ' Zeichnet eine horizontale Linie, dwTypeData und cch werden ' ignoriert. ' Kann nicht mit MFT_BITMAP oder MFT_STRING kombiniert werden Public Const MFT_SEPARATOR = &H800 ' 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. Public Const MFT_STRING = &H0 ' MENUITEMINFO fState-Konstanten ' ============================== ' MenuItem ist Markiert Public Const MFS_CHECKED = &H8 ' MenuItem ist die Standard-Auswahl Public Const MFS_DEFAULT = &H1000 ' MenuItem ist Disabled Public Const MFS_DISABLED = &H2 ' MenuItem ist Enabled Public Const MFS_ENABLED = &H0 ' MenuItem ist Grau und Disabled Public Const MFS_GRAYED = &H1 ' MenuItem hat die Selektierung Public Const MFS_HILITE = &H80 ' MenuItem ist nicht markiert Public Const MFS_UNCHECKED = &H0 ' MenuItem hat nicht die Selektierung Public Const MFS_UNHILITE = &H0 ' TrackPopupmenu uFlags-Konstanten ' ================================ ' Positioniert das Menü horizontal in der Mitte von x Public Const TPM_CENTERALIGN = &H4 ' Positioniert das Menü horizontal mit dem linken Rand auf x Public Const TPM_LEFTALIGN = &H0 ' Positioniert das Menü Horizontal mit dem rechten Rand auf x Public Const TPM_RIGHTALIGN = &H8 ' Positioniert das Menü mit dem unteren Rand auf y Public Const TPM_BOTTOMALIGN = &H20 ' Positioniert das Menü mit dem oberen Rand auf y Public Const TPM_TOPALIGN = &H0 ' Positioniert das Menü vertikal in der Mitte von y Public Const TPM_VCENTERALIGN = &H10 ' Sendet bei Ereignissen kein WM_COMMAND an das Elternfenster Public Const TPM_NONOTIFY = &H80 ' ID des Menüs, welches gewählt wurde Public Const TPM_RETURNCMD = &H100 ' Erlaubt dem Benutzer nur das Markieren der Einträge über ' die linke Maustaste und der Tastatur Public Const TPM_LEFTBUTTON = &H0 ' Erlaubt dem Benutzer die Einträge mit jedem Mausbutton ' zu wählen und der Tastatur Public Const TPM_RIGHTBUTTON = &H2 Um das Beispiel auszuprobieren, fügen Sie den gesamten Deklarations-Teil in ein Modul ein. Erstellen Sie dann eine neue Form und fügen im Allgemein-Teil der Form den nachfolgenden Code ein: Option explicit ' Variablen für unser Test-PopUp Menü Dim hPopupMenu As Long Dim MenuItem(1 To 2) As MENUITEMINFO ' Erstellt das Popupmenü mit zwei Einträgen: ' "Einfügen und Ausschneiden" ' und speichert das Handle in hPopupMenu Private Sub Form_Load() Dim Retval As Long ' Popup-Menü erstellen hPopupMenu = CreatePopupMenu() ' Menü-Eintrag hinzufügen ("&Einfügen") With MenuItem(1) .cbSize = Len(MenuItem(1)) .dwTypeData = "&Einfügen" .cch = Len(Trim$(.dwTypeData)) .fMask = MIIM_TYPE Or MIIM_ID .fState = MFS_DEFAULT Or MFS_HILITE .fType = MFT_STRING .wID = 1 End With Retval = InsertMenuItem(hPopupMenu, 0&, 0&, MenuItem(1)) If Retval = 0 Then Debug.Print "Fehler beim Hinzufügen: (Einfügen)." End If ' Menü-Eintrag hinzufügen ("&Ausschneiden") With MenuItem(2) .cbSize = Len(MenuItem(2)) .dwTypeData = "&Ausschneiden" .cch = Len(Trim$(.dwTypeData)) .fMask = MIIM_TYPE Or MIIM_ID .fState = MFS_DEFAULT Or MFS_HILITE .fType = MFT_STRING .wID = 2 End With Retval = InsertMenuItem(hPopupMenu, 0&, 0&, MenuItem(2)) If Retval = 0 Then Debug.Print "Fehler beim Hinzufügen: (Ausschneiden)." End If End Sub ' Popupmenü entfernen und Ressourcen freigeben Private Sub Form_QueryUnload(Cancel As Integer, _ UnloadMode As Integer) DestroyMenu hPopupMenu End Sub ' Popupmenü anzeigen und auswerten Private Sub Command1_Click() Dim Retval As Long, Flags As Long, CmdPos As RECT ' Position des Fensters ermitteln (CommandButton) GetWindowRect Command1.hwnd, CmdPos ' PopUp-Menü anzeigen Flags = TPM_LEFTBUTTON Or TPM_TOPALIGN Or TPM_NONOTIFY Or _ TPM_RETURNCMD With CmdPos Retval = TrackPopupMenu(hPopupMenu, Flags, .right, _ .bottom, 0&, Me.hwnd, 0&) End With ' Gewähltes Menü ausgeben (wenn denn eine Auswahl ' stattgefunden hat) If Retval <> 0 Then MsgBox "Sie haben den Eintrag """ & _ Replace(MenuItem(Retval).dwTypeData, "&", _ "", 1, 1) & """ gewählt!" End If End Sub Wenn Sie nun den obigen Code aufmerksam angeschaut haben, dann wissen Sie auch, dass auf der Form noch ein CommandButtonCommand1 benötigt wird. Im Form_Load-Ereignis der Form wird das PopUp-Menü erstellt: Ein Menü mit zwei Einträgen - "Einfügen" und "Ausschneiden". Klickt man nun zur Laufzeit auf den CommandButton, so wird das PopUp-Menü neben dem CommandButton angezeigt. Klickt man nun auf einen der beiden Menü-Einträgen, so wird eine MsgBox angezeigt, welche Ihnen sagt, auf welchen Eintrag geklickt wurde. Wird die Form beendet, so wird das zur Laufzeit erstellte PopUp-Menü "zerstört" und aus dem Speicher entfernt, so dass alle belegten Ressourcen wieder freigegeben werden. Dieser Tipp wurde bereits 20.542 mal aufgerufen.
Anzeige
![]() ![]() ![]() (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevZIP40 Pro DLL ![]() Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Tipp des Monats ![]() Dieter Otter Drucken mit Seitenvorschau Ein Beispiel, das zeigt, wie sich ein Ausdruck über das Printer-Objekt zunächst in einer Druckvorschau am Bildschirm anzeigen lässt. sevISDN 1.0 ![]() Überwachung aller eingehender Anrufe! Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |