c++ - Windows 10 CredentialProvider 平铺图像透明度

标签 c++ c winapi windows-10 credential-providers

不久前,我为 Windows 7 创建了一个 CredentialProvider,它为用户显示了一个自定义磁贴图像。当我在 Windows 10 上测试我的 CredentialProvider 时,我注意到磁贴图像不像通常的 Windows 用户图像那样是圆形的,所以我假设,我必须提供我自己的具有透明度的圆形图像。我尝试加载一个透明的圆形 PNG,并在 ICredentialProviderCredentiall::GetBitmapValue() 函数中传递相应的 HBITMAP。不幸的是,PNG 的背景不是透明的,而是白色的。有什么办法可以显示实际的透明度吗?由于 HBITMAP 是由 LogonUI 本身绘制的,因此我无法修改绘制行为。

为了从我的 PNG 资源中创建 HBITMAP,我使用了以下函数:

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() 背景颜色参数的其他值,例如 AlphaMaskAlphaShift,但这些也不起作用(相反,白色背景变成了黑色)

有什么方法可以实现我的目标吗?

最佳答案

最新Credential Provider Technical Reference (这在 MSDN 上并不容易找到)实际上说明了平铺图像的问题是什么:

In Windows 10, the selected User/V1/PLAP credential provider has an image size of 192x192. The ones on the bottom left list is of 48x48. Note LogonUI uses circular image for user and square image for V1/PLAP according to the new design direction. The image size of V2 Credential Provider tile under a selected user is 48x48.

关于c++ - Windows 10 CredentialProvider 平铺图像透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36989628/

相关文章:

c++ - qt 信号导致连接段错误

java - 包装 32 位 .dll 以便它在 64 位操作系统中工作的方法

基于宏函数参数的c++宏输出类型

c++,截断一个char数组

c++ - FindFirstFile/FindNextFile API 对缓存结果是否返回?

c - C 中字符的频率 - 奇怪的数字

c - 检查每个元素在数组中出现次数的函数

c - 指针类型的char数组的反向引用

c++ - MFC:从 CImage 保存到数据库作为选定的文件类型

c++ - 无法使用 FindWindowEx 函数找到子窗口