改变Win32菜单颜色

5
有没有一种方法可以为单个进程更改纯Win32菜单使用的颜色(背景、文本和突出显示),而使用SetSysColors?
(SetSysColors会进行全局更改,这是不好的,如果您在退出之前崩溃或忘记使用SetSysColors再次设置颜色,则它们将不会恢复直到您注销。)
3个回答

13

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); 

3
不幸的是,这只解决了问题的一部分。如果用户已将前景颜色从默认值更改或者您确实想要更改前景颜色,则仅设置背景颜色而不设置前景颜色是一个糟糕的主意。 - CesarB
如果我的应用程序字体是黑色,并且我将菜单的画笔设置为深色,该怎么办?这将导致在暗色背景上看不到。 - Prog1020

4
如果我理解你对Rob的评论,这是针对一个具有特殊外观和感觉的皮肤应用程序。所以,像ferek指出的那样(以不友好的方式...),使用自绘制菜单可能确实是有效的方法:你将能够精确地定义它们的外观。

2
我必须问一下,为什么?采用常规的Windows外观和感觉是好的;这意味着用户可以确信在您的用户界面中存在一致的元素,他们可以将其与使用该平台的其他软件的体验进行映射。[当然,我可能在向已经被说服的人传教,但我认为我应该指出这一点,以便任何阅读此答案的人不会开始使所有菜单变成天蓝色-粉红色,因为它看起来漂亮。]

为了保持程序界面的一致性,不再使用SetSysColors,因为它与普通Windows外观不符。当我开始在那里工作时,程序就是这样的,现在我想要它停止使用SetSysColors。为此,我需要一个替代方案。 - CesarB
5
来自 Redmond 的几乎所有东西都使用不同于普通 Win32 菜单的绘制方式。让我非常烦恼的是这种方式从未出现在操作系统中。目前操作系统级别的 Windows 菜单已经非常过时了,所以自己绘制菜单几乎成为了必要。 - Aardvark
4
这应该是一条评论,而不是一个回答。 - annedroiid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接