Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C+创建所有者绘制的菜单+;,2012款_C++_Winapi_Contextmenu - Fatal编程技术网

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

C++ 使用C+创建所有者绘制的菜单+;,2012款,c++,winapi,contextmenu,C++,Winapi,Contextmenu,我的任务的目标很简单——通过调用TrackPopupMenu API将图标添加到上下文菜单中。但显然,为Windows编写代码就像用勺子划水一样,除了制作自己绘制的菜单之外,没有简单的方法添加图标。所以我做了一些搜索,在主页菜单的菜单上添加了一组C++代码,但是到目前为止我找不到任何适合我的。原因很简单——它绘制的菜单看起来像是从Windows95中出来的。。。那么,有没有什么方法可以让拥有默认Windows7外观的所有者绘制的菜单 另外,如果有一种更简单的方法可以将图标添加到菜单项中,比如Lo

我的任务的目标很简单——通过调用TrackPopupMenu API将图标添加到上下文菜单中。但显然,为Windows编写代码就像用勺子划水一样,除了制作自己绘制的菜单之外,没有简单的方法添加图标。所以我做了一些搜索,在主页菜单的菜单上添加了一组C++代码,但是到目前为止我找不到任何适合我的。原因很简单——它绘制的菜单看起来像是从Windows95中出来的。。。那么,有没有什么方法可以让拥有默认Windows7外观的所有者绘制的菜单

另外,如果有一种更简单的方法可以将图标添加到菜单项中,比如LoadIcon然后ChangeMenuItem来设置它,如果有人能告诉我怎么做,我将不胜感激,因为我很乐意使用它

PS2.好吧,我喜欢的时间太长了。为什么我不能在这个操作系统中完成最简单的任务:(我做了一个例子来说明这个问题。我用我自己的CreatePARGBBitmapFromIcon方法加载位图,该方法将图标转换为PARGB位图(如下所示),然后将其显示在两个位置:CStatic控件(屏幕中间,看起来很好)和菜单项中(完全是f了。)下面是Windows7和XP的屏幕截图(两者看起来完全不同):

伙计们,说真的,我错过了什么

PS3。多亏了@DavidHeffernan,我才得以修复它。以下是解决方案的基础,以下是几个屏幕截图:

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

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

如果真的有,那么所有这些技巧和食谱都将一文不值 用于制作菜单项图标的简单一致的API 图标,Windows和Microsoft中始终存在的东西 应用程序,从来没有得到过任何像样的API,更不用说得到 在每一个主要的Windows版本中,这些图标都会发生变化,使我们 开发人员浪费时间将应用程序“移植”到新的“shinny” Windows而不是做一些有效率的事情

这很好地概括了这一点:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 白痴???


这篇文章告诉您如何做到这一点:

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


在Vista和更高版本上,您放置了一个PARGB32位图(预乘alpha,32位颜色深度)在hbmpItem中,让系统绘制菜单。因此,没有所有者在Vista和更高版本上绘制菜单。虽然主题API确实提供了绘制菜单的功能,但要正确绘制菜单是非常困难的,而且真的没有必要,因为您可以让系统来做。您有三种图标选择:用图标替换字符串,以及使用图标t选中或取消选中时,帽子会显示在它旁边。有关详细信息,请参阅
MENUITEMINFO
结构。选中或取消选中的ASAIK图标只能是单色的。那么第三个选项是什么呢?您可以使用主题API绘制尊重样式的菜单。但这是一个非常糟糕的想法,几乎不可能正确。只有真正伟大的c希望成功。所以不要这样做。让系统绘制菜单并为图标提供HBITMAP。在
MENUITEMINFO
hbmpItem
字段中提供它。32bpp,PARGB。例如:@user843732,我能找到的只是它必须与默认的复选标记位图大小相同。Mac和Wi之间还有另一个区别ndows。你15年的Windows代码今天仍然运行良好。在Mac上不是这样。请记住,你使用的是最低级别的Windows API。如果你选择WPF,说你也可以在2分钟内完成菜单。你就是那个人!我修复了它。工作解决方案附在我的原始帖子中。再次感谢!