半透明渐变的窗口效果

此代码由CSDN 空气提供 空 气  15:12:09 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;                 }             }         }     } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值