Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0639: Farbe von Menüs ändern

 von 

Beschreibung 

Hier wird gezeigt, wie man die Farbe von Menüs per API setzen kann.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

CreateSolidBrush, DrawMenuBar, GetMenu, GetMenuItemCount (GetMenuItemCountA), GetSubMenu, GetSystemMenu, OleTranslateColor, SetMenuInfo

Download:

Download des Beispielprojektes [3,21 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Menü "mnuFile"
' Steuerelement: Menü "mnuFileHere" auf mnuFile
' Steuerelement: Menü "mnuFileStands" auf mnuFile
' Steuerelement: Menü "mnuFileA" auf mnuFile
' Steuerelement: Menü "mnuFileText" auf mnuFileA
' Steuerelement: Menü "mnuHere"
' Steuerelement: Menü "mnuHereToo" auf mnuHere

Option Explicit

Private Sub Form_Click()
    PopupMenu mnuFile
End Sub

Private Sub Form_Load()
    Set_MenuColor mMenuColor, Me.Hwnd, vbBlue, 1, False
    Set_MenuColor mMenuBarColor, Me.Hwnd, vbRed
    Set_MenuColor mSysMenuColor, Me.Hwnd, vbYellow
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'---- Anfang Modul "modMenuColor" alias modMenuColor.bas ----



'Geschrieben von Wolfgang Ehrhardt
'                   woeh@gmx.de
   
Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long

Private Declare Function GetMenu Lib "user32" (ByVal Hwnd As Long) As Long

Private Declare Function DrawMenuBar Lib "user32" _
    (ByVal Hwnd As Long) As Long

Private Declare Function SetMenuInfo Lib "user32" _
    (ByVal Hmenu As Long, Mi As MENUINFO) As Long

Private Declare Function OleTranslateColor Lib "olepro32.dll" _
    (ByVal OLE_COLOR As Long, ByVal HPALETTE As Long, _
    pccolorref As Long) As Long

Private Declare Function GetSystemMenu Lib "user32" _
    (ByVal Hwnd As Long, ByVal bRevert As Long) As Long

Private Declare Function GetMenuItemCountA Lib "user32" Alias _
    "GetMenuItemCount" (ByVal Hmenu As Long) As Long

Private Declare Function GetSubMenu Lib "user32" _
    (ByVal Hmenu As Long, ByVal nPos As Long) As Long

Private Type MENUINFO
    cbSize          As Long
    fMask           As Long
    dwStyle         As Long
    cyMax           As Long
    hbrBack         As Long
    dwContextHelpID As Long
    dwMenuData      As Long
End Type

Public Enum MenuNFO
    mMenuBarColor = 1
    mMenuColor = 2
    mSysMenuColor = 3
End Enum

Private Const MIM_BACKGROUND As Long = &H2&
Private Const MIM_APPLYTOSUBMENUS As Long = &H80000000

'*** Dokumentation der Funktion ***
'Beschreibung
    'Färbt ein angegebenes MenuElement in eine angegebene Farbe ein.

'Rückgabewert
'True wenn MenuElement erfolgreich eingefärbt wurde

'Übergabewert(e)
'[SetWhat As MenuNFO]
    'mMenuBarColor
        'Färbt die MenuBar
        'MenuIndex & IncludeSubmenus kann weggelaßen werden
    'mMenuColor
        'Färbt einen Menueintrag mit/ohne Untermenueinträge
    'mSysMenuColor
        'Färbt das SystemMenu
        'MenuIndex & IncludeSubmenus kann weggelaßen werden
'Hwnd
    'Verweis auf das Hwnd des Menu-Owners
'Color
    'Farbe, in die eingefärbt werden soll
'Optional MenuIndex As Integer
    'Nur gültig bei mMenucolor
    'Einzufärbendes MenuElement
'Optional IncludeSubmenus As Boolean = False
    'Nur gültig bei mMenucolor
    'Wird True angegeben und hat das Menuelement eine Untermenu,
    'so wird dieses mitgefärbt.

Public Function Set_MenuColor(SetWhat As MenuNFO, _
    ByVal Hwnd As Long, ByVal Color As Long, _
    Optional MenuIndex As Integer, _
    Optional IncludeSubmenus As Boolean = False) As Boolean
    
    Dim Mi As MENUINFO
    Dim clrref As Long, hSysMenu As Long, mHwnd As Long
         
    On Local Error Goto Quit
   
    clrref = Convert_OLEtoRBG(Color)
   
    Mi.cbSize = Len(Mi)
    Mi.hbrBack = CreateSolidBrush(clrref)
    
    Select Case SetWhat
        Case mMenuBarColor
            Mi.fMask = MIM_BACKGROUND
            Call SetMenuInfo(GetMenu(Hwnd), Mi)
            
        Case mMenuColor
            If MenuIndex = 0 Then
                Set_MenuColor = Set_MenuColor(mMenuBarColor, Hwnd, Color)
                Exit Function
            End If
            
            If MenuIndex < 1 Or Get_MenuItemCount(Hwnd) < MenuIndex Then _
                Exit Function
    
            Mi.fMask = IIf(IncludeSubmenus, _
                           MIM_BACKGROUND Or MIM_APPLYTOSUBMENUS, _
                           MIM_BACKGROUND)
            
            mHwnd = GetMenu(Hwnd)
            mHwnd = GetSubMenu(mHwnd, MenuIndex - 1)
        
            Call SetMenuInfo(mHwnd, Mi)
            Hwnd = mHwnd
            
        Case mSysMenuColor
            hSysMenu = GetSystemMenu(Hwnd, False)
   
            Mi.fMask = MIM_BACKGROUND _
                       Or MIM_APPLYTOSUBMENUS
            
            Call SetMenuInfo(hSysMenu, Mi)
            Hwnd = hSysMenu
    End Select
    
    Call DrawMenuBar(Hwnd)
    Set_MenuColor = True
Quit:
End Function

Private Function Convert_OLEtoRBG(ByVal OLEcolor As Long) As Long
    Call OleTranslateColor(OLEcolor, 0, Convert_OLEtoRBG)
End Function

Private Function Get_MenuItemCount(ByVal Hwnd As Long) As Long
    Get_MenuItemCount = GetMenuItemCountA(Get_MenuHwnd(Hwnd))
End Function

Private Function Get_MenuHwnd(ByVal Hwnd As Long) As Long
    Get_MenuHwnd = GetMenu(Hwnd)
End Function
'----- Ende Modul "modMenuColor" alias modMenuColor.bas -----
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 6 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Peter am 15.11.2010 um 08:57

Hallo,

das Programm zun Menüfarben ändern funktioniert sehr gut, meine frage dazu ist, wie kann ich die Schriftfarbe in der Menüleiste ändern. Das aufgeklappte Menü ist in blau. Die Schrift ist in schwarz. Ich möchte die in weiß ändern und beim überfahren mit der Maus soll die markierte Auswahl in gelb erscheinen. sowie die Hintergrundfarbe der markierten Auswahl. Wie kann ich das erreichen.

Gruß´Peter

Kommentar von olga Thoben am 12.10.2007 um 10:32

Hallo, bin relativ neu in der Programmierung mit vb 6.0. Habe ein programm geschrieben mit mehren menüpunkten, nun habe ich dies modul verwendet um die einzelnen menüpunkte und untermenüs ein zufärben, das klappt auch ganz bestens.
Mein programm läuft einwandfrei und die menüs werden farblich dargestellt, super. Nur wenn ich in den freien bildschirm clicke kommt die fehlermeldung 424 - Objekt erforderlich, drücke ich ignorieren gehts normal weiter, clicke ich auf abbrechen wird mein programm beendet und meine momentanen daten sind verloren. Wie kann ich dieses problem lösen das keine fehlermeldung mehr kommt.

Viele dank olga

Kommentar von am 29.03.2005 um 20:44

Kann ich eingendlich auch irgendwie bestimmen wie der Selektierte Menüeintrag auszusehen hat?

http://www.activevb.de/tipps/vb6tipps/tipp0639.html

Kommentar von MrPC am 19.02.2005 um 14:28

Nicht schlecht, aber leider gehts bei Popup Menüs auf UserControls nicht.

Kommentar von Philipp am 14.02.2005 um 22:10

Schöner Tipp!

Es geht sogar noch mehr:
Verwendet man

CreatePatternBrush(<MyBitmap>.Handle)

statt
CreateSolidBrush(<Color>)

kann man sogar ein Hintergrundbild verwenden.
Allerdings ist dieses unter Win9x auf 8x8 Pixel beschrenkt!

Es stört nur noch der Auswahlbalken.

Kommentar von Martin Schreck am 20.01.2005 um 09:44

Hallo

der Tip, um die MenüBar farbig zu gestalten ist gut , nur leider bleibt das selektierte Menü dennoch grau und das sieht sehr störend aus wenn alles andere Farbig ist. Wer hat eine Idee hierzu ?

Gruss

M.S.