Winapi 更改Win32菜单颜色

Winapi 更改Win32菜单颜色,winapi,menu,colors,Winapi,Menu,Colors,有没有一种方法可以在不使用SetSysColors的情况下,为单个进程更改普通Win32菜单(背景、文本和突出显示)使用的颜色 (SetSysColors会进行全局更改,这很糟糕,如果在退出之前崩溃或忘记再次使用SetSysColors设置颜色,它们将在注销之前不会恢复。)SetMenuInfo()API是您的朋友。它允许您应用任何笔刷来绘制菜单的背景 以下几点可以解决您的问题: MENUINFO mi = { 0 }; mi.cbSize = sizeof(mi); mi.fMask =

有没有一种方法可以在不使用SetSysColors的情况下,为单个进程更改普通Win32菜单(背景、文本和突出显示)使用的颜色

(SetSysColors会进行全局更改,这很糟糕,如果在退出之前崩溃或忘记再次使用SetSysColors设置颜色,它们将在注销之前不会恢复。)

SetMenuInfo()API是您的朋友。它允许您应用任何笔刷来绘制菜单的背景

以下几点可以解决您的问题:

MENUINFO mi = { 0 }; 
mi.cbSize = sizeof(mi); 
mi.fMask = MIM_BACKGROUND|MIM_APPLYTOSUBMENUS; 
mi.hbrBack = hBrush; 

HMENU hMenu = ::GetMenu(hWnd); 
SetMenuInfo(hMenu, &mi); 

我不得不问,为什么?采用常规窗户的外观和感觉良好;这意味着用户可以确信您的用户界面中有一致的元素,他们可以将使用其他平台软件的体验映射到这些元素上


[当然,我可能是在向皈依者说教,但我想我会指出这一点,这样,任何读到答案的人都不会因为菜单看起来很漂亮而开始把所有菜单都变成天蓝色粉红色。]

如果我相信你对Rob的评论,这是一款外观和感觉都很特别的皮肤应用程序。因此,正如ferek指出的(以一种不友好的方式…)使用所有者绘制的菜单,我们的做法可能是:您将能够精确定义它们的外观。

不幸的是,这只能解决部分问题。如果用户更改了默认的前景色,或者您确实想更改前景色,那么在不设置前景色的情况下设置背景色是个坏主意。如果我的应用程序字体为黑色,而我为菜单的画笔设置了深色,该怎么办?为了与程序界面的其他部分保持一致,该界面已经不符合常规的Windows外观。当我开始在那里工作时已经是这样了,我想让它停止使用SetSysColor。为此,我需要一个替代方案。几乎所有从Redmond出来的东西都会以不同于普通Win32菜单的方式绘制菜单。它真的让我恼火,因为它从来没有进入操作系统。操作系统级的Windows菜单已经过时,现在几乎需要自己绘制菜单。这应该是一个注释,而不是答案。