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.670 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (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. |
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. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. TOP! Unser Nr. 1 Neu! sevDataGrid 3.0 Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. |
||||||||||||||||
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. |