在 MFC 中对菜单项使用透明 PNG 时出现问题

问题描述 投票:0回答:1

我被引导到这里现有的答案:

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);
}

但这就是我得到的结果:

enter image description here

我不确定如何使用链接讨论中的广告代码。

我的方法不起作用,因为PNG中的透明度变成白色。

enter image description here

visual-c++ bitmap mfc png menuitem
1个回答
0
投票

嗯,论坛中有几篇关于此的帖子,其中包括一些建议操作位图的帖子。正如@IInspectable 在您的链接答案中指出的那样,GDI 使用预乘阿尔法。因此,一个简单的解决方法是将所有完全透明的像素更改为黑色。为此,您需要一个支持图层的图像编辑器。步骤可以是:

  • 添加黑色背景层(在堆栈的底部)。
  • 在此之上添加一个灰色层 - 该应用程序可以在浅色或深色模式 Windows 计算机上运行,因此这对于两者来说都是可以接受的。
  • 最重要的是你有你的形象。加载 Alpha 并使其成为该层的蒙版。
  • 合并灰色和图像图层。
  • 创建 Alpha 的副本,并修改它,使黑色(即 (0,0,0))像素保持原样,所有其他像素变为白色 (255,255,255)。将此作为合并图层的蒙版。然后删除复制/修改的 alpha。
  • 合并黑色背景和新的合并图层。现在你有一个 RGB 层和一个 Alpha 通道(原始)。
  • 保存文件。

上述步骤将使所有透明区域变黑,而图像(我特指过渡区域)将与灰色背景合并,试图保留“平滑”效果,因此不会出现“锯齿”。

尝试下面的PNG。我省略了中间灰色层的步骤,因为我做不到,因为我没有阿尔法。

Modified menu icon

旁注,您不需要将

CPngImage
图像复制到
CBitmap
变量,因为
CPngImage
源自
CBitmap
,您可以将
CPngImage
图像直接传递给
SetMenuItemBitmaps()

© www.soinside.com 2019 - 2024. All rights reserved.