【发布时间】: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 可以为您完成这一切。
-
怎么样?!设置复选标记图像仅允许单色字形。那里的大多数技术和讨论表明您必须使用所有者绘制(或自定义窗口),就代码行而言,其中任何一个都可以是广泛的。这是我能找到的允许彩色图标的最低要求。
-
使用
MENUITEMINFO的hbmpItem字段。支持不完整。 Win2000 不支持。适用于 XP。在 Vista 及更高版本上,您应该放入 PARGB32 位图,但它会发光。这是获得带有字形的良好 Vista/7 风格菜单的唯一可靠方法。主题 API 自定义绘图方法几乎不可能正确。您是否注意到您的菜单在 Vista/7 上看起来很不合适?那是因为你是自定义绘制它们。