【问题标题】:how to draw a disabled icon如何绘制禁用的图标
【发布时间】:2012-03-15 05:48:27
【问题描述】:

我终于开始为我们的下拉菜单添加图标了:


在这张图片中,您可以看到除了突出显示的线之外的所有内容都没有问题。突出显示的线很好,除了图标是彩色的,而不是灰色的。

我的代码基于极简主义方法:
http://www.codeproject.com/Articles/16529/Simple-Menus-That-Display-Icons-Minimalistic-Appro?msg=4166441#xx4166441xx

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

它适用于我们的目的,除非选择禁用(灰色)的菜单项。
但是,当菜单项变灰并被选中时,绘制的图标会显示为启用时的样子。错误的。 :(

然而,当背景被突出显示/选择时,完全相同的绘图代码可以工作。

这让我相信有一些完全包含在 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 行实现。

【问题讨论】:

  • 我不知道这是如何工作的,但 Windows 执行此操作的明显方法是为您提供一个由灰度位图支持的内存 DC。显然它不能在选定的情况下这样做,因为它需要绘制颜色。您可以使用 GetCurrentObject 和 GetObject 检查它是否这样做。
  • 您无需所有者绘制即可在菜单上添加字形。 Windows 可以为您完成这一切。
  • 怎么样?!设置复选标记图像仅允许单色字形。那里的大多数技术和讨论表明您必须使用所有者绘制(或自定义窗口),就代码行而言,其中任何一个都可以是广泛的。这是我能找到的允许彩色图标的最低要求。
  • 使用MENUITEMINFOhbmpItem 字段。支持不完整。 Win2000 不支持。适用于 XP。在 Vista 及更高版本上,您应该放入 PARGB32 位图,但它会发光。这是获得带有字形的良好 Vista/7 风格菜单的唯一可靠方法。主题 API 自定义绘图方法几乎不可能正确。您是否注意到您的菜单在 Vista/7 上看起来很不合适?那是因为你是自定义绘制它们。

标签: c++ winapi mfc


【解决方案1】:

你可以使用:

DrawState(...)

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

【讨论】:

  • IIRC DrawState 的质量很差。
  • ::DrawState(lpdis->hDC, NULL, NULL, (LPARAM)pIcon->GetHandle(), NULL, lpdis->rcItem.left, lpdis->rcItem.top, pIcon-> GetSize().cx, pIcon->GetSize().cy, DST_ICON|DSS_UNION);
  • 这对我来说是一个很好的解决方案。比编写/测试手动灰度实现更可取。
  • 仅供参考 - DSS_UNION 呈现灰色文本外观,有点奇怪。 DSS_DISABLED 对边缘进行浮雕,使图标看起来像是移动或弹出。我玩过钢笔和画笔和文本和背景颜色,但最后,DSS_DISABLED 在各种透明的地方也使用了高亮颜色(蓝色)。所以 DSS_UNION 与这项技术一样好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多