CButtonST 使用EnableWindow(FALSE)禁用按键使能后,图标显示为灰白浮雕,很难看,几乎看不到原图的轮廓!
禁用使能前:
禁用使能后:
后想了个办法,按钮disable后将图标转成灰度再显示出来;
按照这个思路修改后的效果:
注意:如果要显示半透明效果,建议不用使用背景色透明的ICON,因为半透明ICON边缘处理很糟糕!
建议ICON背景色设为RGB(240,240,240),也可以显示半透明效果的;
按照这个思路来处理,后面发现CButtonST类里面就有将图标转为灰度的功能,如下:
CreateGrayscaleIcon(HICON icon);
修改DrawTheIcon()方法,对源代码做了简单处理,如下:
void CButtonST::DrawTheIcon(CDC* pDC, BOOL bHasTitle, RECT* rpItem, CRect* rpCaption, BOOL bIsPressed, BOOL bIsDisabled)
{
BYTE byIndex = 0;
// Select the icon to use
if ((m_bIsCheckBox && bIsPressed) || (!m_bIsCheckBox && (bIsPressed || m_bMouseOnButton)))
byIndex = 0;
else
byIndex = (m_csIcons[1].hIcon == NULL ? 0 : 1);
CRect rImage;
PrepareImageRect(bHasTitle, rpItem, rpCaption, bIsPressed, m_csIcons[byIndex].dwWidth, m_csIcons[byIndex].dwHeight, &rImage);
// Ole'!
//DSS_DISABLED
HICON disabledIcon = NULL;
//按键disable;创建灰度ICON图标;
if(bIsDisabled)
disabledIcon = CreateGrayscaleIcon(m_csIcons[byIndex].hIcon); //2020 09-10 修改
pDC->DrawState( rImage.TopLeft(),
rImage.Size(),
(bIsDisabled?disabledIcon:m_csIcons[byIndex].hIcon),//2020 05-22 修改
DSS_NORMAL, // 2020 05-22修改(bIsDisabled ? DSS_DISABLED: DSS_NORMAL),
(CBrush*)NULL);
if(disabledIcon!=NULL)DestroyIcon(disabledIcon); //释放内存
}
CreateGrayscaleIcon(HICON icon);这个函数还是有点问题的,带背景无阴影效果的ICON文件转换还是可以,但对半透明图标支持不是很友好,在codeProject找到了一个同名方法替换,这个同名方法支持半透明,效果也很好!
(CreateGrayscaleIcon which supports 24 and 32 bpp icons ) codeProject 地址:
https://www.codeproject.com/Articles/18636/CreateGrayscaleIcon-which-supports-24-and-32-bpp-i
把CreateGrayscaleIcon.h文件添加进来,把BtnST.CPP文件中原CreateGrayscaleIcon函数注释掉就可以了;