【问题标题】:Create owner drawn menus with C++, 2012-style使用 C++ 创建所有者绘制的菜单,2012 风格
【发布时间】:2012-11-19 18:55:43
【问题描述】:

我的任务目标很简单——将图标添加到通过调用 TrackPopupMenu API 显示的上下文菜单中。但显然,为 Windows 编码就像用勺子划桨一样,除了制作所有者绘制的菜单之外,没有简单的方法可以添加图标。所以我做了一些搜索,找到了一堆关于所有者绘制菜单的 C++ 代码,但到目前为止我找不到任何对我有用的东西。原因很简单——它绘制的菜单看起来像是从 Windows 95 中出来的东西……那么有什么方法可以制作具有默认 Windows 7 外观的自绘菜单吗?

PS。如果有一种更简单的方法可以向菜单项添加图标,例如 LoadIcon 然后 ChangeMenuItem 来设置它,如果有人能告诉我如何设置它,我将不胜感激,因为我很乐意改为使用它......

PS2. 好的,我不喜欢它花费的时间太长了。为什么我似乎不能在这个操作系统中完成最简单的任务:(我做了一个small test project 来说明这个问题。我用自己的 CreatePARGBBitmapFromIcon 方法加载位图,该方法将图标转换为 PARGB 位图(如下所示)然后在两个地方显示它:CStatic 控件(屏幕中间,看起来不错)和菜单项中(完全是这样)。这是 Windows 7 和 XP 的屏幕截图(两者看起来完全不同):

所以伙计们,说真的,我在这里错过了什么????

PS3。感谢@DavidHeffernan,我得以修复它。 Here's the working C++/MFC solution,这是解决方案所基于的article,这里有几个屏幕截图:

仅供参考,我花了大约 2 天时间来解决这个问题——在 OS X 或 iOS 上大约需要 2 分钟......

最后是我完全赞同的源文章中我最喜欢的几句话:

如果只有 用于制作菜单项图标的简单一致的 API。不幸的是菜单 图标,Windows 和 Microsoft 中一直存在的东西 应用程序,从来没有任何像样的 API,而且获得的方法 这些图标在每个主要的 Windows 版本中都会发生变化,让我们 开发人员浪费我们的时间将我们的应用程序“移植”到新的“shinny” Windows 而不是做一些富有成效的事情

总结得很好:

啊啊啊啊啊啊啊啊啊啊啊啊啊啊!为什么微软被填满 白痴???

【问题讨论】:

  • 您对图标 AFAIK 有三种选择:用图标替换字符串,以及在选中或取消选中时在其旁边显示图标。有关详细信息,请参阅MENUITEMINFO 结构。
  • ASAIK 选中或未选中的图标只能是单色的。那么第三个选项是什么?
  • 你可以做尊重风格的所有者绘制菜单。使用主题 API。但这是一个糟糕透顶的想法,几乎不可能做对。只有真正的伟人才能期待成功。所以不要那样做。让系统绘制菜单并为图标提供 HBITMAP。在MENUITEMINFOhbmpItem 字段中提供它。 32bpp,PARRGB。例如:nanoant.com/programming/…
  • @user843732,我只能找到它必须与默认复选标记位图的大小相同。
  • Mac 和 Windows 之间还有另一个区别。您 15 年前的 Windows 代码今天仍然可以正常运行。在 Mac 上并非如此。请记住,您使用的是最低级别的 Windows API。如果您选择 WPF,那么您也可以在 2 分钟内完成菜单。

标签: c++ winapi contextmenu


【解决方案1】:

这篇文章告诉你怎么做:http://www.nanoant.com/programming/themed-menus-icons-a-complete-vista-xp-solution

总之,在 XP 上,您应该在 MENUITEMINFO 结构的 hbmpItem 字段中传递 HBMMENU_CALLBACK。这会让你的菜单所有者绘制,但你只需要处理 WM_MEASUREITEM 和 WM_DRAWITEM 中的图标。

在 Vista 及更高版本中,您将 PARGB32 位图(预乘 alpha,32 位颜色深度)放入 hbmpItem 并让系统绘制菜单。因此,没有所有者可以使用 Vista 及更高版本。虽然主题 API 确实提供了绘制菜单的功能,但要做好是非常困难的,而且真的没有必要,因为您可以让系统来做。

【讨论】:

  • 你就是那个男人!我修好了它。工作解决方案附在我的原始帖子中。再次感谢!
猜你喜欢
  • 2021-11-24
  • 2010-12-01
  • 2023-03-12
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多