我被引导到这里现有的答案:
https://stackoverflow.com/a/60222653/2287576
但我正在努力遵循该准则。这就是我所拥有的:
CPngImage png;
png.Load(IDB_PNG_MENU_REPORT, AfxGetResourceHandle());
m_bmp.Attach(png.Detach());
//CBitmap png = (HBITMAP)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_PNG_MENU_REPORT),
// IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
auto pMenu = GetMenu();
if (pMenu)
{
pMenu->SetMenuItemBitmaps(ID_MANAGE_CONGREGATIONS_REPORT_VIEWER, MF_BYCOMMAND, &m_bmp, &m_bmp);
}
但这就是我得到的结果:
我不确定如何使用链接讨论中的广告代码。
我的方法不起作用,因为PNG中的透明度变成白色。
嗯,论坛中有几篇关于此的帖子,其中包括一些建议操作位图的帖子。正如@IInspectable 在您的链接答案中指出的那样,GDI 使用预乘阿尔法。因此,一个简单的解决方法是将所有完全透明的像素更改为黑色。为此,您需要一个支持图层的图像编辑器。步骤可以是:
上述步骤将使所有透明区域变黑,而图像(我特指过渡区域)将与灰色背景合并,试图保留“平滑”效果,因此不会出现“锯齿”。
尝试下面的PNG。我省略了中间灰色层的步骤,因为我做不到,因为我没有阿尔法。
旁注,您不需要将
CPngImage
图像复制到 CBitmap
变量,因为 CPngImage
源自 CBitmap
,您可以将 CPngImage
图像直接传递给 SetMenuItemBitmaps()
。