Rubrik: Oberfläche · Menüs | VB-Versionen: VB4, VB5, VB6 | 10.12.01 |
Farbige Menüs in unterschiedlichen Schriften Weg mit den eintönigen Menüs in VB und rein in die bunten Möglichkeiten des Menü-Windows-API ;-) | ||
Autor: Thomas Bannert | Bewertung: | Views: 22.648 |
ohne Homepage | System: Win9x, WinNT, Win2k, Win8, Win10, Win11 | Beispielprojekt auf CD |
Gehören Sie auch zu denjenigen, die es satt haben, dass die Menüs innerhalb der eigenen Anwendung immer im tristen Windows-Grau (oder der im System festgelegten Farbe) angezeigt werden?
Warum kann man nicht einfach wenigstens die Vordergrundfarbe frei festlegen? Das Ändern der Schriftart und/oder der Schriftattribute wäre eigentlich auch nicht schlecht.
Also, worauf warten Sie!
Unser nachfolgender Tipp zeigt, wie sich die Menüs, welche Sie mit dem Menüeditor in der VB-Entwicklungsumgebung erstellt haben, zur Laufzeit ein wenig optisch aufpeppen lassen
Um das ganze auch gleich ausprobieren zu können, erstellen Sie ein neues Projekt, öffnen den VB-Menüeditor und legen folgende Menüstruktur fest:
Beenden (MenuExit)
Test (MenuTest)
Eintrag 1 (mnuTest(0))
Eintrag 2 (mnuTest(1))
Eintrag 3 (mnuTest(2))
Plazieren Sie nun noch auf die Form eine PictureBox (picMenu) und setzen die Eigenschaften, wie folgt:
AutoRedraw = True
Index = 0
Visible = False
Was Sie jetzt noch benötigen, ist nachfolgender Code. Diesen können Sie direkt in den Codeteil der Form einfügen.
Option Explicit ' API Deklarationen Private Declare Function GetMenu Lib "user32" ( _ ByVal hwnd As Long) As Long Private Declare Function GetSubMenu Lib "user32" ( _ ByVal hMenu As Long, _ ByVal nPos As Long) As Long Private Declare Function GetMenuItemID Lib "user32" ( _ ByVal hMenu As Long, _ ByVal nPos As Long) As Long Private Declare Function ModifyMenu Lib "user32" _ Alias "ModifyMenuA" ( _ ByVal hMenu As Long, _ ByVal nPosition As Long, _ ByVal wFlags As Long, _ ByVal wIDNewItem As Long, _ ByVal lpString As Any) As Long ' API Konstanten Const MF_BYCOMMAND = &H0& Const MF_BITMAP = &H4&
Beim Laden der Form werden nun die drei Einträge das zweite Menüs (Test) ein wenig manipuliert:
Private Sub Form_Load() Dim i As Long ' Handle der Menüzeile Dim hMenu As Long ' Handle betreffenden "SubMenüs" Dim hSubMenu As Long ' Das jeweilige Menü Items Dim lMenuItemID As Long ' Laufende Nummer der Schriftart Dim lFont As Long ' Der jeweilige Menütext Dim sMenuText As String ' Vordergrundfarben ReDim fColor(3) As Long fColor(1) = vbBlack fColor(2) = vbBlue fColor(3) = vbBlack On Error GoTo Error_ ' Prüfen, ob Schriftart "Verdana" vorhanden lFont = -1 For i = 0 To Screen.FontCount If Screen.Fonts(i) = "Verdana" Then lFont = i Exit For End If Next i If lFont = -1 Then lFont = 0 ' Sicher ist sicher ' Handle der Menüzeile hMenu = GetMenu(Me.hwnd) ' Handle des "Test"-Menüs hSubMenu = GetSubMenu(hMenu, 1) ' Menü-Einträge des "Test"-Menüs manipulieren For i = 1 To 3 sMenuText = mnuTest(i - 1).Caption Load picMenu(picMenu.Count) With picMenu(picMenu.Count - 1) ' neue Schriftart setzen .Font.Name = Screen.Fonts(lFont) .Font.Size = 6 + i .Font.Bold = (i = 2) ' Höhe .Height = .TextHeight(sMenuText) + 40 ' Breite .Width = .TextWidth(sMenuText) + 105 ' Vordergrundfarbe .ForeColor = fColor(i) ' Text des Menüeintrages in die Picture Box picMenu(picMenu.Count - 1).Print sMenuText .Picture = .Image ' Picture in das Menü setzten lMenuItemID = GetMenuItemID(hSubMenu, i - 1) Call ModifyMenu(hSubMenu, lMenuItemID, _ MF_BYCOMMAND Or MF_BITMAP, lMenuItemID, _ CLng(.Picture)) ' und schon ist der Dekel auf dem Topf ;-) End With Next i Exit Sub Error_: ' ... End Sub
Starten Sie das Projekt und öffnen Sie das Menü "Test" - und lassen sich überraschen
Wie funktioniert das?
Ganz einfach Wir gaukeln dem Menü vor, dass es sich um Bilder handelt, welche anstelle des Text-Eintrags dann angezeigt werden sollen. Und es sind ja eigentlich auch Bilder, da wir den Text in der gewünschten Schrift und Farbe in eine PictureBox "malen" und das so erzeugte Bild dem Menü zuweisen.