【问题标题】:Changing Win32 menu colors更改 Win32 菜单颜色
【发布时间】:2008-10-18 16:10:20
【问题描述】:

有没有办法为单个进程更改普通 Win32 菜单(背景、文本和突出显示)使用的颜色,而不使用 SetSysColors?

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

【问题讨论】:

    标签: winapi menu colors


    【解决方案1】:

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

    【讨论】:

    • 不幸的是,这只解决了部分问题。如果用户更改了默认的前景色,或者您确实想更改前景色,则设置背景色而不设置前景色是一个坏主意。
    • 如果我的应用程序的字体为黑色,我为菜单的画笔设置了深色怎么办?天黑时它会变黑。
    【解决方案2】:

    如果我相信您对 Rob 的评论,那是针对具有特殊外观和感觉的蒙皮应用程序。因此,正如 ferek 指出的那样(以一种不友好的方式......),要走的路可能确实是使用所有者绘制的菜单:您将能够精确地定义它们的外观。

    【讨论】:

      【解决方案3】:

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

      [当然,我可能是在向皈依者传教,但我想我会指出这一点,因此任何阅读此答案的人都不会开始将他们所有的菜单都变成天蓝色-粉红色,因为它看起来漂亮。]

      【讨论】:

      • 为了与程序界面的其余部分保持一致,这已经不遵循常规的 Windows 外观。当我开始在那里工作时已经是这样了,我想让它停止使用 SetSysColors。为此,我需要一个替代方案。
      • 几乎所有来自 Redmond 的东西都以不同于普通 Win32 菜单的方式绘制菜单。这真的让我很恼火,这从来没有进入操作系统。操作系统级别的 Windows 菜单已经过时,如今几乎需要自己绘制它们。
      • 这应该是评论,而不是答案。
      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多