【发布时间】:2008-10-18 16:10:20
【问题描述】:
有没有办法为单个进程更改普通 Win32 菜单(背景、文本和突出显示)使用的颜色,而不使用 SetSysColors?
(SetSysColors 会进行全局更改,这很糟糕,如果您在退出之前崩溃或忘记再次使用 SetSysColors 设置颜色,则在您注销之前它们不会恢复。)
【问题讨论】:
有没有办法为单个进程更改普通 Win32 菜单(背景、文本和突出显示)使用的颜色,而不使用 SetSysColors?
(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 外观很好;这意味着用户可以确信您的用户界面中有一致的元素,他们可以将使用该平台的其他软件的体验映射到这些元素上。
[当然,我可能是在向皈依者传教,但我想我会指出这一点,因此任何阅读此答案的人都不会开始将他们所有的菜单都变成天蓝色-粉红色,因为它看起来漂亮。]
【讨论】: