• PNG透明图片按钮


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

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

    2.使用ATL CImage类, Load(LPCTSTR) 方法加载一个图片,可以发现图片透明部分显示为白色。这是因为显示每像素实际像素值需要和ALPHA值做预乘,而该方法没做ALPHA值混合,也就相当于和纯白色值混合,所以透明部分会现白色(http://blog.csdn.net/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);

  • 相关阅读:
    Android weight属性详解
    设计模式(一)__单例设计模式
    Java中线程的生命周期
    抽象类和接口
    SQL sever 怎样将DBF文件导入到数据库
    JS去除字符串中空格,及常用正则表达式
    Oracle 11g问题1:关于error:ORA12541: TNS: 没有监听器
    access、excel取随机n条记录
    tsql字符串操作
    测试SQL Server执行时间和CPU时间
  • 原文地址:https://www.cnblogs.com/aishangxue/p/3545083.html
Copyright © 2020-2023  润新知