5

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

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

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

在此处输入图像描述

在此处输入图像描述

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

PS3。感谢@DavidHeffernan,我能够修复它。这是有效的 C++/MFC 解决方案,这是该解决方案所基于的文章,下面是几个屏幕截图:

在此处输入图像描述 在此处输入图像描述

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

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

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

这很好地总结了它:

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

4

1 回答 1

9

这篇文章告诉你怎么做: 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 确实提供了绘制菜单的功能,但要做到正确非常困难,而且实际上没有必要,因为您可以让系统来做。

于 2012-12-03T10:44:10.843 回答