松鼠的博客

导航

统计

半透明渐变的窗口效果

void CSemiTransWnd::Update(long type,POINT *pTopLeft)
{
    if(m_hWnd&&m_iWidth&&m_iHeight&&m_pdwRGBAData&&m_pDC&&m_pBmp)//指针正确
    {
        //获取屏幕DC
        CDC dcScreen;
        dcScreen.Attach(::GetDC(NULL));

        //处理Alpha 通道
        DealAlphaChannel();
        CRect rectDlg;
        GetWindowRect(m_hWnd,&rectDlg);
        CPoint ptWindowScreenPosition(rectDlg.TopLeft());
        if(pTopLeft)
        {
            ptWindowScreenPosition.x=pTopLeft->x;
            ptWindowScreenPosition.y=pTopLeft->y;
        }
        //刷新到屏幕上
        CSize szWindow(m_iWidth, m_iHeight);
        CPoint ptSrc(0,0);
        int alpha;
        switch(type)
        {
        case 2: //淡出
            for(alpha=m_iWndSemiTransAlpha;alpha>=0;alpha--)
            {
                BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, alpha,AC_SRC_ALPHA };
                UpdateLayeredWindow(m_hWnd, dcScreen, &ptWindowScreenPosition, &szWindow, *m_pDC,&ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
            }
            break;
        case 1: //淡入
            for(alpha=0;alpha<=m_iWndSemiTransAlpha;alpha++)
            {
                BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, alpha,AC_SRC_ALPHA };
                UpdateLayeredWindow(m_hWnd, dcScreen, &ptWindowScreenPosition, &szWindow, *m_pDC,&ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
            }
            break;
        case 0: //直接刷新
        default:
            BLENDFUNCTION blendPixelFunction= { AC_SRC_OVER, 0, m_iWndSemiTransAlpha,AC_SRC_ALPHA };
            UpdateLayeredWindow(m_hWnd, dcScreen, &ptWindowScreenPosition, &szWindow, *m_pDC,&ptSrc, 0, &blendPixelFunction, ULW_ALPHA);
            break;
        }
    }//end if
}

 空 气  15:12:25
//    处理Alpha通道 处理用户绘制部分的不透明度
void CSemiTransWnd::DealAlphaChannel(void)
{
    if(m_pdwRGBAData&&m_pBmp) //指针正确
    {
        if(m_bSemiTransAlphaUpdate||m_bTransAlphaUpdate)//需要处理Alpha
        {
            //获取位图数据
            BITMAP bmpInfo;

            m_pBmp->GetBitmap(&bmpInfo);

            BYTE        *rgba    = (BYTE*)bmpInfo.bmBits;
            BYTE        *rgbb    = (BYTE*)m_pdwRGBAData;        
            long        i;

            for(i=0;i<bmpInfo.bmHeight*bmpInfo.bmWidth;i++)
            {
                if(rgba[0]!=rgbb[0]||rgba[1]!=rgbb[1]||rgba[2]!=rgbb[2]) //颜色不同
                {
                    if((rgbb[3] == 0x00 && m_bTransAlphaUpdate)||  //透明Alpha值更新
                        (rgbb[3] != 0x00 && m_bSemiTransAlphaUpdate)) //半透明 Alpha值更新
                    {
//                        rgba[3]=0xFF;
                    }
                    rgba+=4;
                    rgbb+=4;
                }
            }
        }
    }
}

posted on   Xproer-松鼠  阅读(901)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示