VB 5/6-Tipp 0639: Farbe von Menüs ändern
von Wolfgang Ehrhardt
Beschreibung
Hier wird gezeigt, wie man die Farbe von Menüs per API setzen kann.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: CreateSolidBrush, DrawMenuBar, GetMenu, GetMenuItemCount (GetMenuItemCountA), GetSubMenu, GetSystemMenu, OleTranslateColor, SetMenuInfo | Download: |
'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-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
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.