vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2019
 
zurück
Rubrik: Oberfläche · Menüs   |   VB-Versionen: VB4, VB5, VB617.09.01
PopUp-Menü per API

Ein Beispiel, wie sich ein PopUp-Menü zur Laufzeit per Windows-API erstellen und anzeigen lässt.

Autor:   LonelySuicide666Bewertung:     [ Jetzt bewerten ]Views:  18.872 
www.vbapihelpline.deSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

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 18.872 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!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.
 
   

Druckansicht Druckansicht Copyright ©2000-2019 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel