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

属性表显示的是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);
现在没有品红色偏色了。
作为参考,我对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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
