Dieser Tipp zeigt Ihnen, wie Sie das Systemmenü eines Formulares beliebig erweitern können und auf das Click-Ereignis des neuen Eintrages reagieren. Kopieren Sie den folgenden Code in ein Modul: Option Explicit ' API-Funktionen für das Erstellen der Menüeinträge Private Declare Function GetSystemMenu Lib "user32" ( _ ByVal hwnd As Long, _ ByVal bRevert As Long) As Long Private Declare Function InsertMenu Lib "user32" _ Alias "InsertMenuA" ( _ ByVal hMenu As Long, _ ByVal nPosition As Long, _ ByVal wFlags As Long, _ ByVal wIDNewItem As Long, _ ByVal lpNewItem As Any) As Long ' API-funktionen für das Subclassing Private Declare Function SetWindowLong Lib "user32" _ Alias "SetWindowLongA" ( _ ByVal hwnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Private Declare Function CallWindowProc Lib "user32" _ Alias "CallWindowProcA" ( _ ByVal lpPrevWndFunc As Long, _ ByVal hwnd As Long, _ ByVal Msg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Private Const MF_SEPARATOR = &H800& Private Const MF_BYPOSITION = &H400& Private Const GWL_WNDPROC = (-4) Private Const WM_SYSCOMMAND = &H112 Private lngPrevProc As Long Private intItemID As Integer Public Enum MenuInsertType Separator = 0 MenuByPosition = 1 End Enum ' neuen Menü-Eintrag hinzufügen Public Function CreateMenuEntry(ByVal strName As String, _ ByVal lngFormHwnd As Long, _ ByVal intMenuPosition As Integer, _ ByVal mnuType As MenuInsertType) As Boolean Dim lngMnuHandle As Long Dim lngRetValue As Long Dim intFlag As Integer On Error GoTo errHandler ' Handle des SystemMenu lngMnuHandle = GetSystemMenu(lngFormHwnd, False) ' Eintragtyp aus Enum ermitteln Select Case mnuType Case MenuInsertType.MenuByPosition intFlag = MF_BYPOSITION Case MenuInsertType.Separator intFlag = MF_SEPARATOR End Select If lngMnuHandle Then ' Menüeintrag erstellen lngRetValue = InsertMenu(lngMnuHandle, intMenuPosition, _ intFlag, intItemID, strName) End If CreateMenuEntry = True Exit Function errHandler: CreateMenuEntry = False Err.Clear End Function ' einen Hook auf das Form erstellen Public Sub CreateHook(ByVal lngHwnd As Long) lngPrevProc = SetWindowLong(lngHwnd, GWL_WNDPROC, AddressOf WindowProc) End Sub ' WICHTIG: den Hook wieder freigeben Public Sub ReleaseHook(ByVal lngHwnd As Long) SetWindowLong lngHwnd, GWL_WNDPROC, lngPrevProc End Sub ' Subclassing Public Function WindowProc(ByVal hwnd As Long, _ ByVal uMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long WindowProc = CallWindowProc(lngPrevProc, hwnd, uMsg, wParam, lParam) If uMsg = WM_SYSCOMMAND Then If wParam = intItemID Then MsgBox "Neuer Menüeintrag Click ... " End If End If End Function Um nun unser neues Modul zu testen, müssen Sie ein neues Formular erstellen und folgenden Code einfügen: Private Sub Form_Load() ' Menü-Eintrag hinzufügen If CreateMenuEntry("Testeintrag", Me.hwnd, 5, MenuByPosition) = True Then Call MsgBox("Menüeintrag erfolgreich erstellt!") End If Call CreateHook(Me.hwnd) End Sub Private Sub Form_Unload(Cancel As Integer) ' WICHTIG! Korrrektes Beenden des Subclassing! Call ReleaseHook(Me.hwnd) End Sub Dieser Tipp wurde bereits 5.601 mal aufgerufen.
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv (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. |
vb@rchiv CD Vol.6 ![]() Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats Dietrich Herrmann Einsatz einer DimmingForm Es wird eine Form vorgestellt, mit deren Hilfe man den gesamten Bildschirm auf verschiedene Arten mit transparenter Farbe überdecken und nur eine eigene Form im Vordergrund zeigen kann. sevMail für VB/VBA ![]() Mails abrufen und senden - ganz easy :-) Mailversand mit ZIP-Funktion, Unterstützung von SMTP-AUTH (authentifizierter Mailversand), Abholen von Mails mit Vorschau, Mail-Parser zum Decodieren aller MIME-Parts und Anlagen, RTF2HTML-Funktion 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. |
|||||||||||||||||



System-Menü eines Forms erweitern II


