Rubrik: Oberfläche · Menüs | VB-Versionen: VB4, VB5, VB6 | 12.01.04 |
Menü in der Menüleiste rechts ausrichten Rechts ausgerichtete Menüs werden vom VB-Menüeditor nicht unterstützt. Mit Hilfe des Windows-APIs ist es aber ein Leichtes, ein oder mehrere Menüs in der Menüleiste rechts anzuzeigen. | ||
Autor: Dieter Otter | Bewertung: | Views: 13.075 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
In einigen Anwendungen wird das "Hilfe"-Menü nicht direkt hinter dem letzten Menü angezeigt, sondern immer ganz rechts in der Menüleiste. Unter VB3 / VB4-16Bit konnte man ein Menü ebenfalls rechts ausrichten, indem man der Beschriftung einfach ein Tabulator-Zeichen voranstellte:
MenuHelp.Caption = Chr$(9) & "&Hilfe"
Leider funktioniert dieser Code seit VB5 nicht mehr. Der VB-Menüeditor selbst bietet auch keine entsprechende Funktion
Wie so oft, hilft uns in diesem Fall das Windows-API weiter. Zunächst ermitteln wir das Handle der Menüleiste. Danach wird per GetMenuItemInfo-Aufruf die Menüstruktur des Menüs ausgelesen. Durch Setzen des Flags MFT_RIGHTJUSTIFY und Zurückschreiben der geänderten Struktur lässt sich das Menü dann rechtsbündig anzeigen.
Fügen Sie nachfolgenden Code in ein Modul ein:
Option Explicit ' benötigte API-Deklarationen Private Declare Function GetMenu Lib "user32" ( _ ByVal hWnd As Long) As Long Private Declare Function GetMenuItemCount Lib "user32" ( _ ByVal hMenu As Long) As Long Private Declare Function GetMenuItemInfo Lib "user32" _ Alias "GetMenuItemInfoA" ( _ ByVal hMenu As Long, _ ByVal un As Long, _ ByVal b As Long, _ lpMenuItemInfo As MENUITEMINFO) As Long Private Declare Function SetMenuItemInfo Lib "user32" _ Alias "SetMenuItemInfoA" ( _ ByVal hMenu As Long, _ ByVal un As Long, _ ByVal bool As Boolean, _ lpcMenuItemInfo As MENUITEMINFO) As Long Private Declare Function DrawMenuBar Lib "user32" ( _ ByVal hWnd As Long) As Long Private Const MIIM_SUBMENU = &H4 Private Const MIIM_TYPE = &H10 Private Const MFT_RIGHTJUSTIFY = &H4000& 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
' Menü(folge) rechts anzeigen Public Sub ShowMenuItemOnRight(ByVal hWnd As Long, _ Optional ByVal nMenuItem As Long = -1) Dim hMenu As Long Dim tMenuInfo As MENUITEMINFO ' Handle der Menüleiste der Form hMenu = GetMenu(hWnd) If hMenu <> 0 Then ' Falls das Menü nicht angegegen wurde, jetzt ' das letzte Menü der Menüleiste ermitteln If nMenuItem = -1 Then nMenuItem = GetMenuItemCount(hMenu) End If ' MenuInfo-Struktur lesen With tMenuInfo .cbSize = Len(tMenuInfo) .fMask = MIIM_SUBMENU Or MIIM_TYPE .cch = 256 .dwTypeData = Space(.cch) Call GetMenuItemInfo(hMenu, nMenuItem - 1, True, tMenuInfo) ' Jetzt Flag für rechtsbündig setzen .fType = .fType Or MFT_RIGHTJUSTIFY End With ' MenuInfo-Struktur zurückschreiben Call SetMenuItemInfo(hMenu, nMenuItem - 1, 1, tMenuInfo) ' Menüleiste neu zeichnen DrawMenuBar hWnd End If End Sub
Beispiele für den Aufruf:
Private Sub Form_Load() ' letztes Menü der Menuleiste rechts anzeigen ShowMenuItemOnRight Me.hWnd End Sub
Private Sub Form_Load() ' ab 3. Menü - alles rechts anzeigen ShowMenuItemOnRight Me.hWnd, 3 End Sub
Private Sub Form_Load() ' alle Menüs rechts anzeigen :-) ShowMenuItemOnRight Me.hWnd, 1 End Sub