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

时间:2012-12-01 21:54:17

标签: c++ winapi contextmenu

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

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

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

enter image description here

enter image description here

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

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

enter image description here enter image description here

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

最后我从源文章中得到了一些我最喜欢的引言:

  

如果只有那些,所有这些黑客和食谱将毫无价值   用于制作菜单项图标的简单一致的API。不幸的菜单   图标,Windows和Microsoft中始终存在的图标   应用程序,从来没有得到任何体面的API,而且还有获得的方法   这些图标适用于每个主要的Windows版本,制作我们   开发人员浪费时间将我们的应用程序“移植”到新的“闪亮”   Windows,而不是做一些富有成效的事情

这总结得很好:

  

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGH!为什么微软充满了   白痴???

1 个答案:

答案 0 :(得分: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确实提供了绘制菜单的功能,但是很难做到正确,而且实际上没有必要,因为你可以让系统完成它。