有没有办法在不使用 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);
我不得不问,为什么?采用常规的 Windows 外观很好;这意味着用户可以确信您的用户界面中有一致的元素,他们可以使用该平台的其他软件将他们的体验映射到这些元素上。
[当然,我可能是在向皈依者讲道,但我想我会指出这一点,因此任何阅读此答案的人都不会开始将所有菜单都变成天蓝色-粉红色,因为它看起来很漂亮。]
如果我相信您对 Rob 的评论,那是针对具有特殊外观和感觉的蒙皮应用程序。因此,正如 ferek 指出的那样(以一种不友好的方式......),要走的路可能确实是使用所有者绘制的菜单:您将能够精确地定义它们的外观。