Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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++_Winapi_Mfc - Fatal编程技术网

C++ 如何绘制禁用的图标

C++ 如何绘制禁用的图标,c++,winapi,mfc,C++,Winapi,Mfc,我终于开始在下拉菜单中添加图标了: 在这张图中,您可以看到,除了突出显示的线之外,其他一切都正常。高亮显示的线很好,但图标除外,它是用彩色绘制的,而不是灰色的 我的代码基于一种极简主义的方法: 基本上,这只需要我绘制图标,而不必使用自定义代码管理菜单项的所有方面。非常漂亮 除选择禁用(灰色)菜单项外,它适用于我们的目的。 但当菜单项变灰并选中时,绘制的图标将显示为启用时的状态。错( 但是,当背景高亮显示/选中时,完全相同的图形代码也会起作用 这让我相信,HDC中完全包含一些语句,它们必须控制

我终于开始在下拉菜单中添加图标了:


在这张图中,您可以看到,除了突出显示的线之外,其他一切都正常。高亮显示的线很好,但图标除外,它是用彩色绘制的,而不是灰色的

我的代码基于一种极简主义的方法:

基本上,这只需要我绘制图标,而不必使用自定义代码管理菜单项的所有方面。非常漂亮

除选择禁用(灰色)菜单项外,它适用于我们的目的。
但当菜单项变灰并选中时,绘制的图标将显示为启用时的状态。错(

但是,当背景高亮显示/选中时,完全相同的图形代码也会起作用

这让我相信,HDC中完全包含一些语句,它们必须控制图标的显示方式,因为下面的代码在所有条件下都可以工作,但选中的除外:

::DrawIconEx(lpdis->hDC, lpdis->rcItem.left+0, lpdis->rcItem.top, pIcon->GetHandle(), pIcon->GetSize().cx, pIcon->GetSize().cy, 0, NULL, DI_NORMAL);
有人知道HDC中封装了什么状态来控制DrawIconEx的工作方式吗?如果我可以在选择的绘图期间复制HDC状态,就像在未选择绘图时一样,我应该能够生成灰色图标,而无需使用30-50行实现来手动对内存中的图标进行灰度缩放。

您可以n用途:

DrawState(...)

API函数,带有DSS_DISABLED标志,但我不确定输出的质量。

我不知道这是如何工作的,但Windows实现这一点的明显方法是为您提供一个由灰度位图支持的内存DC。显然,在所选情况下,它不能这样做,因为它需要用颜色绘制。您可以检查它是否这样做使用GetCurrentObject和GetObject。菜单上不需要所有者绘图就可以有图示符。Windows可以为您完成这一切。如何设置?!设置复选标记图像只允许使用单色图示符。大多数技术和讨论都表明您必须使用所有者绘图(或自定义窗口)这是我能找到的允许彩色图标的最小值。使用
MENUITEMINFO
hbmpItem
字段。支持是不完整的。在Win2000上不支持。在XP上工作。在Vista和更高版本上,你应该放入一个PARGB32位图,但它会发光。这是唯一的改进可以通过glyphs获得良好的Vista/7样式菜单。主题API自定义绘图方法几乎不可能正确。您是否注意到您的菜单在Vista/7上看起来非常不合适?这是因为您是自定义绘图。IIRC DrawState的质量非常差。::DrawState(lpdis->hDC,NULL,NULL,(LPARAM)pIcon->GetHandle(),NULL,lpdis->rcItem.left,lpdis->rcItem.top,pIcon->GetSize().cx,pIcon->GetSize().cy,DST_图标| DSS_联合);对于我来说,这是一个很好的解决方案。与编写/测试手动灰度实现相比,我更喜欢它。仅供参考-DSS_UNION提供了灰色文本外观,有点奇怪。禁用DSS_会浮雕边缘,这会使图标出现移动或弹出。我使用钢笔、画笔、文本和背景色,但最终禁用DSS_也会使用在各种透明的地方突出显示颜色(蓝色)。因此DSS_UNION在这项技术中表现得非常好。