使用C++,2012风格创建所有者绘制的菜单

c00*_*0fd 4 c++ winapi contextmenu

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

PS.如果有一种更简单的方法可以向菜单项添加图标,比如LoadIcon然后使用ChangeMenuItem进行设置,我会很高兴有人能告诉我如何,因为我很乐意用它代替它...

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

在此输入图像描述

在此输入图像描述

伙计们,说真的,我在这里失踪了什么????

PS3.感谢@DavidHeffernan,我能够解决它.这是有效的C++/MFC解决方案,这是一个解决方案基于的文章,这里有几个屏幕截图:

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

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

最后,我完全赞同源文章中我最喜欢的一些引言:

如果只有简单一致的API来制作菜单项图标,那么所有这些黑客和食谱都将毫无价值.不幸的是,Windows和Microsoft应用程序中始终存在的菜单图标从来没有得到任何合适的API,而且每个主要Windows版本都会使这些图标工作的方法发生变化,这使我们的开发人员浪费时间将我们的应用程序"移植"到新的" shinny"Windows而不是做一些富有成效的事情.

这总结得很好:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGH!为什么微软被白痴填充?

Dav*_*nan 7

本文将告诉您如何操作:http://www.nanoant.com/programming/themed-menus-icons-a-complete-vista-xp-solution

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

在Vista及更高版本中,您在hbmpItem中放置了一个PARGB32位图(预乘alpha,32位颜色深度),让系统绘制菜单.所以,没有所有者在Vista和平局上画画.虽然主题API确实提供了绘制菜单的功能,但是很难做到正确并且实际上没有必要,因为你可以让系统去做.