CButtonST 禁用图标按键显示优化

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函数注释掉就可以了;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值