如何透明地将 HICON 从 GDI 复制到 GDI+?

Posted

技术标签:

【中文标题】如何透明地将 HICON 从 GDI 复制到 GDI+?【英文标题】:How do I copy an HICON from GDI to GDI+ with transparency? 【发布时间】:2012-07-05 11:37:34 【问题描述】:

无论我做什么,我都会在图标周围出现白色/黑色边框......这是什么原因?!

是否可能正确地做到这一点?如何将 HICON 复制到具有透明度的 GDI+ 位图?

【问题讨论】:

【参考方案1】:

我只是浪费了几个小时。

加上我之前浪费了多少次,是的,这很令人沮丧。

原来这是 GDI+ 的问题。解决方法是here;下面是一些可能有帮助的代码:

HICON hIcon = ...;

ICONINFO ii; GetIconInfo(hIcon, &ii);
BITMAP bmp; GetObject(ii.hbmColor, sizeof(bmp), &bmp);

Gdiplus::Bitmap temp(ii.hbmColor, NULL);
Gdiplus::BitmapData lockedBitmapData;
Gdiplus::Rect rc(0, 0, temp.GetWidth(), temp.GetHeight());

temp.LockBits(&rc, Gdiplus::ImageLockModeRead, temp.GetPixelFormat(), &lockedBitmapData);

Gdiplus::Bitmap image(
    lockedBitmapData.Width, lockedBitmapData.Height, lockedBitmapData.Stride,
    PixelFormat32bppARGB, reinterpret_cast<BYTE *>(lockedBitmapData.Scan0));

temp.UnlockBits(&lockedBitmapData);

// Now 'image' has the icon, with transparency

【讨论】:

非常感谢。我遇到了同样的黑线问题。我尝试了您的解决方案,但遇到了另一个问题:缺少一些线条和像素。我尝试使用 BITMAP 并根据它们调整此代码,现在图像已完美呈现! @hackjutsu:我认为应该是lockedBitmapData

以上是关于如何透明地将 HICON 从 GDI 复制到 GDI+?的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的字节数组创建 HICON?

将 HICON / HCURSOR 复制到字节数组中

C# GDI+导入图片如何让背景透明

c++gdi如何让图片透明

如何使用GDI绘制半透明矩形

从位图和透明度颜色创建蒙版 - Windows GDI