不久前,我为 Windows 7 创建了一个 CredentialProvider,它为用户显示了一个自定义平铺图像。当我在 Windows 10 上测试我的 CredentialProvider 时,我注意到平铺图像不像通常的 Windows 用户图像那样是圆形的,所以我假设我必须提供我自己的具有透明度的圆形图像。我试图加载一个圆形的透明PNG并HBITMAP
在ICredentialProviderCredentiall::GetBitmapValue()
函数中传递相应的。不幸的是,PNG 的背景不是透明的,而是白色的。有没有办法显示实际的透明度?由于HBITMAP
是由 LogonUI 本身绘制的,因此我无法修改绘图行为。
为了创建HBITMAP
我的 PNG 资源,我使用以下函数:
HBITMAP LoadPNG(HINSTANCE hInst, int resourceId)
{
HGLOBAL hGlobal;
LPSTREAM pStream;
HBITMAP tBmp = NULL;
ULONG_PTR token = 0;
Gdiplus::GdiplusStartupInput input = NULL;
Gdiplus::GdiplusStartup(&token, &input, NULL);
if (token != 0)
{
HRSRC hRsrc = FindResource(hInst, MAKEINTRESOURCE(resourceId), TEXT("PNG"));
HGLOBAL hGlob1 = LoadResource(hInst, hRsrc);
int size = SizeofResource(hInst, hRsrc);
hGlobal = GlobalAlloc(GMEM_FIXED, size);
LPVOID resPtr = LockResource(hGlob1);
memcpy(hGlobal, resPtr, size);
FreeResource(hGlob1);
CreateStreamOnHGlobal(hGlobal, true, &pStream);
Gdiplus::Bitmap* bmp = new Gdiplus::Bitmap(pStream, false);
bmp->GetHBITMAP(Gdiplus::Color::Transparent, &tBmp);
Gdiplus::GdiplusShutdown(token);
}
return tBmp;
}
我还尝试了背景颜色参数的其他值, GetHBITMAP()
例如AlphaMask
and AlphaShift
,但是这些也不起作用(相反,白色背景变成了黑色)
有什么方法可以实现我的目标吗?