状态栏中窗格的“我的应用程序设置”图标(类CMFCStatusBar)。此任务只有一种方法-CMFCStatusBar :: SetPaneIcon()。但是,如果图标具有Alpha通道,则此方法会加载错误的图像(在黑色背景上)。
我查看了源代码,发现CMFCStatusBar对每个窗格都使用内部HIMAGELIST。所有这HIMAGELIST创建带有标志ILC_MASK | ILC_COLORDDB,而不是ILC_COLOR32或ILC_COLOR24。
这是一个错误!
因此,有没有办法在CMFCStatusBar窗格中的alpha通道中使用图标?
例:
HICON hIcon = ::LoadImage(hModule, MAKEINTRESOURCE(nIconID), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR);
m_StatusBar.SetPaneIcon(m_StatusBar.CommandToIndex(ID_INDICATOR_1), hIcon);
最佳答案
Microsoft从BCG toolkit开发了CMFC类(功能包)。如果将CMFCStatusBar::SetPaneIcon()
方法与同一类的BCG方法进行比较,则会发现一些细微的差异。
BCG使用标志来定义其方法以进行Alpha混合。该方法如下所示:
void CBCGPStatusBar::SetPaneIcon (int nIndex, HBITMAP hBmp,
COLORREF clrTransparent, BOOL bUpdate, BOOL bAlphaBlend/* = FALSE*/)
等效的CMFC会删除“ bAlphaBlend”标志。
比较方法代码,您会看到BCG使用了从CMFC版本中删除的以下代码:
DWORD dwFlags = ILC_MASK | ILC_COLORDDB;
if (bAlphaBlend)
{
dwFlags = ILC_COLOR32;
}
pSBP->hImage = ::ImageList_Create (pSBP->cxIcon, pSBP->cyIcon, dwFlags, 1, 0);
我不确定CMFC版本为何会有如此大的差异(Microsoft可能有正当的理由),但是,我在下面提供了BCG版本。我将研究BCG版本,并可能根据该代码创建您自己的“ SetPaneIcon”方法(后果自负)。
void CBCGPStatusBar::SetPaneIcon (int nIndex, HBITMAP hBmp,
COLORREF clrTransparent, BOOL bUpdate, BOOL bAlphaBlend/* = FALSE*/)
{
ASSERT_VALID(this);
CBCGStatusBarPaneInfo* pSBP = _GetPanePtr(nIndex);
if (pSBP == NULL)
{
ASSERT (FALSE);
return;
}
// Disable animation (if exist):
SetPaneAnimation (nIndex, NULL, 0, FALSE);
if (hBmp == NULL)
{
if (pSBP->hImage != NULL)
{
::ImageList_Destroy (pSBP->hImage);
}
pSBP->hImage = NULL;
if (bUpdate)
{
InvalidatePaneContent (nIndex);
}
return;
}
BITMAP bitmap;
::GetObject (hBmp, sizeof (BITMAP), &bitmap);
if (pSBP->hImage == NULL)
{
pSBP->cxIcon = bitmap.bmWidth;
pSBP->cyIcon = bitmap.bmHeight;
DWORD dwFlags = ILC_MASK | ILC_COLORDDB;
if (bAlphaBlend)
{
dwFlags = ILC_COLOR32;
}
pSBP->hImage = ::ImageList_Create (pSBP->cxIcon, pSBP->cyIcon, dwFlags, 1, 0);
RecalcLayout ();
}
else
{
ASSERT (pSBP->cxIcon == bitmap.bmWidth);
ASSERT (pSBP->cyIcon == bitmap.bmHeight);
::ImageList_Remove (pSBP->hImage, 0);
}
//---------------------------------------------------------
// Because ImageList_AddMasked changes the original bitmap,
// we need to create a copy:
//---------------------------------------------------------
HBITMAP hbmpCopy = (HBITMAP) ::CopyImage (hBmp, IMAGE_BITMAP, 0, 0, 0);
if (bAlphaBlend)
{
::ImageList_Add (pSBP->hImage, hbmpCopy, NULL);
}
else
{
::ImageList_AddMasked (pSBP->hImage, hbmpCopy, clrTransparent);
}
::DeleteObject (hbmpCopy);
if (bUpdate)
{
InvalidatePaneContent (nIndex);
}
}
关于c++ - CMFCStatusBar::SetPaneIcon是否支持Alpha图标?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32589909/