CreateGrayscaleIcon 支持 24 和 32 bpp 图标






3.72/5 (20投票s)
一个 C++ 函数,使用 GDI 创建基于通道的图标版本。利用所有通道,你可以创建一个灰度图标。
引言
在更新我的 Hyperlink 控件 时,我遇到了一个问题,即在控件处于禁用状态时自动创建一个灰度图标。我在 CodeProject 上搜索,找到了 Davide Calabro 的 CreateGrayscaleIcon,但我注意到它不支持 32bpp 图标。此外,我认为它的资源使用量有点过大。所以我决定自己编写一个,这就是结果。
有趣的是,我发现仅仅稍微修改调色板填充循环就可以创建任何通道比例的图标,所以我重写了该函数并对其进行重载,以支持自定义调色板参数,从而让你进行自定义替换。请查看演示项目以了解我的意思。如果你想在 C 程序中使用此函数,只需更改重载版本为带有默认参数的版本即可。
使用代码
该函数非常易于使用。只需调用 CreateGrayscaleIcon
并传递你的 HICON
,该函数将返回新的灰度图标。
HICON myIcon = (HICON)::LoadImage( AfxFindResourceHandle(MAKEINTRESOURCE(ICON_ID), RT_GROUP_ICON), MAKEINTRESOURCE(ICON_ID), IMAGE_ICON, 0, 0, 0); HICON grayIcon = CreateGrayscaleIcon(myIcon);
如果你想使用重载版本,只需创建一个调色板并将其传递给函数,如下所示
COLORREF palette[256];
for(int i = 0; i < 256; i++)
{
palette[i] = RGB(255-i, 255-i, 255-i);
}
HICON myIcon = (HICON)::LoadImage(
AfxFindResourceHandle(MAKEINTRESOURCE(ICON_ID), RT_GROUP_ICON),
MAKEINTRESOURCE(ICON_ID), IMAGE_ICON, 0, 0, 0);
HICON grayIcon = CreateGrayscaleIcon(myIcon,palette);
这将创建一个灰度图标,就像默认的未重载的 CreateGrayscaleIcon
一样。
注释
我在我的硬盘上找到了这个图标,但真诚地不知道它来自哪里,所以如果它是受版权保护的材料,并且权利所有者不希望我使用它,请告诉我,我将用其他东西替换它。
结论
就这样,我想。如果你有任何问题或疑问,请随时发帖。