为什么我的属性表中的Outlook栏图标带有洋红色的色调?

编程语言 2026-07-09

我在使用MFC。

Sample images

属性表显示的是32 x 32的图片,而对话框里的静态控件显示的是64 x 64的版本。

  • 属性表的类型是 CMFCPropertySheet
  • 其他两个图片的类型是 CStatic

CStatic

静态控件将透明PNG加载到 CPngImage 对象中。例如:

m_pngLogo.Load(IDB_PNG_IMAGE);
m_staticLogo.SetBitmap(m_pngLogo);

效果很好。

CMFCPropertySheet

属性表使用一个 CImageList。所以:

m_imgList.Create(32, 32, ILC_COLOR32, 5, 5);

CPngImage png;
png.Load(IDB_PNG_ICONS);

CBitmap bmp;
bmp.Attach(png.Detach());
m_imgList.Add(&bmp, nullptr);

SetIconsList(m_imgList);
SetLook(CMFCPropertySheet::PropSheetLook_OutlookBar);

我在猜这和我创建图像列表的方式有关吗?在这两种情况下,PNG文件都是32位透明的。因此我不明白为什么会出现品红色的偏色。我想你可以用任意PNG图像很容易重现这个问题。

解决方案

我查看了 SetIconsList 的定义,发现有一个覆写(override):

BOOL SetIconsList(UINT uiImageListResID, int cx, COLORREF clrTransparent = RGB(255, 0, 255));

所以,我需要做的就是使用:

SetIconsList(IDB_PNG_MEETING_MATERIAL_LIGHT, 32);

New icons

现在没有品红色偏色了。

作为参考,我对MFC的源码进行了深入研究:

BOOL CMFCPropertySheet::SetIconsList(UINT uiImageListResID, int cx, COLORREF clrTransparent)
{
    ASSERT_VALID(this);

    ENSURE(uiImageListResID != 0);

    HBITMAP hbmp = NULL;

    // Try to load PNG image first:
    CPngImage pngImage;
    if (pngImage.Load(MAKEINTRESOURCE(uiImageListResID)))
    {
        hbmp = (HBITMAP) pngImage.Detach();
    }
    else
    {
        hbmp = (HBITMAP) ::LoadImageW(AfxFindResourceHandle(MAKEINTRESOURCE(uiImageListResID), RT_BITMAP), MAKEINTRESOURCEW(uiImageListResID), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
    }

    if (hbmp == NULL)
    {
        TRACE(_T("Can't load image: %x\n"), uiImageListResID);
        return FALSE;
    }

    CImageList icons;
    m_bAlphaBlendIcons = FALSE;

    BITMAP bmpObj;
    ::GetObject(hbmp, sizeof(BITMAP), &bmpObj);

    UINT nFlags = (clrTransparent == (COLORREF) -1) ? 0 : ILC_MASK;

    switch (bmpObj.bmBitsPixel)
    {
    case 4:
    default:
        nFlags |= ILC_COLOR4;
        break;

    case 8:
        nFlags |= ILC_COLOR8;
        break;

    case 16:
        nFlags |= ILC_COLOR16;
        break;

    case 24:
        nFlags |= ILC_COLOR24;
        break;

    case 32:
        nFlags |= ILC_COLOR32;
        m_bAlphaBlendIcons = TRUE;
        break;
    }

    icons.Create(cx, bmpObj.bmHeight, nFlags, 0, 0);
    icons.Add(CBitmap::FromHandle(hbmp), clrTransparent);

    SetIconsList(icons);

    ::DeleteObject(hbmp);
    return TRUE;
}

The m_bAlphaBlendIcons variable appears to be the key but I do not ee it listed in the official documentation.

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章