PNG透明图片按钮

本文探讨了在Windows应用中遇到的半透明图片按钮显示为全白的问题,并提供了通过重绘父窗口部分来解决此问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.按钮好像被半透明白色罩住了。

解决方法就是相应ON_WM_ERASEBKGND,仅仅返回TRUE即可。

2.使用ATL CImage类, Load(LPCTSTR) 方法加载一个图片,可以发现图片透明部分显示为白色。这是因为显示每像素实际像素值需要和ALPHA值做预乘,而该方法没做ALPHA值混合,也就相当于和纯白色值混合,所以透明部分会现白色(http://blog.youkuaiyun.com/mergerly/article/details/4710676)。

3.ALPHA值混合:

if(_tcsicmp(pszFileName+(_tcslen(pszFileName)-4), _T(".png"))==0){
            if(m_BtnBG.GetBPP() == 32){
                for(int i=0; i<m_BtnBG.GetWidth(); i++){
                    for(int j=0; j<m_BtnBG.GetHeight(); j++){
                        UCHAR *pChar = (UCHAR*)m_BtnBG.GetPixelAddress(i,j);
                        pChar[0] = pChar[0]*pChar[3]/255;
                        pChar[1] = pChar[1]*pChar[3]/255;
                        pChar[2] = pChar[2]*pChar[3]/255;
                    }
                }
            }
        }

GetBPP()值是每像素的位数,只有32位的图片才有ALPHA通道(RGB各8位+alpha值8位)。

4.半透明图片按钮鼠标在上面晃几次半透明部分颜色变深。

这个原因是因为按钮下面的父窗口部分没有绘制,按钮半透明部分多次绘制的颜色重合在一起了。解决方法就是在OnMouseHover(),OnMouseLeave()事件中重绘下面父窗体部分:

//repaint parent
    RECT rc;
    GetWindowRect(&rc);
    ::ScreenToClient(GetParent()->GetSafeHwnd(), (LPPOINT)&rc);
    ::ScreenToClient(GetParent()->GetSafeHwnd(), ((LPPOINT)&rc+1));
    GetParent()->InvalidateRect(&rc);

 

转载于:https://www.cnblogs.com/aishangxue/p/3545083.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值