现在的位置: 首页 > 综合 > 正文

半透效果实现

2018年07月06日 ⁄ 综合 ⁄ 共 5010字 ⁄ 字号 评论关闭

evc下两种实现半透明背景的函数

作者:中国嵌入式系统开发

实现两张图片叠加,半透明效果。

sdmmclogozx.bmpsdmmclogohangsheng.bmp

void CGPS_eDogDlg::TransBitmap(HDC hDC,RECT rect,double Trans)
{     
    int nWidth   = rect.right - rect.left;                          //半透明区域的宽度
    int nHeight = rect.bottom - rect.top;                          //半透明区域的高度

HDC hBackDC;
hBackDC = CreateCompatibleDC(hDC);
HBITMAP hBackBitmap;
hBackBitmap = (HBITMAP)SHLoadDIBitmap(_T(sdmmclogozx.bmp));
SelectObject(hBackDC,hBackBitmap);

HBITMAP hUpBitmap;
HDC hUpDC;
hUpDC = CreateCompatibleDC(hDC);
hUpBitmap = (HBITMAP)SHLoadDIBitmap(_T(sdmmclogohangsheng.bmp));
SelectObject(hUpDC,hUpBitmap);
     
    //新建一个DC来拷贝目标区域
    HDC BackDC;                                                            
    BackDC = CreateCompatibleDC(hBackDC);
    HBITMAP BackBitmap ;
    BackBitmap = CreateCompatibleBitmap(hBackDC , nWidth , nHeight);
    HBITMAP hOldBmp =(HBITMAP)SelectObject(BackDC,BackBitmap);
    BitBlt(BackDC , 0 , 0 , nWidth , nHeight , hBackDC , rect.left , rect.top , SRCCOPY);

    //获取BackDC中的图形数据到BYTE数组
    HDC hBackDIBDC = CreateCompatibleDC(BackDC);

    BITMAPINFO hdr;
    ZeroMemory(&hdr , sizeof(BITMAPINFO));

    hdr.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
    hdr.bmiHeader.biWidth      = nWidth;
    hdr.bmiHeader.biHeight     = nHeight;
    hdr.bmiHeader.biPlanes     = 1;
    hdr.bmiHeader.biBitCount = 24;      

    BYTE * pBuffer = NULL ;
    HBITMAP hBackDIBitmap = CreateDIBSection(hBackDIBDC,
                                                            (BITMAPINFO *)&hdr,
                                                             DIB_RGB_COLORS,
                                                             (void **)&pBuffer,
                                                             NULL,
                                                             0);

    HBITMAP pOldBmp = (HBITMAP)SelectObject(hBackDIBDC, hBackDIBitmap);
    BitBlt(hBackDIBDC,0,0,nWidth,nHeight,BackDC,0,0,SRCCOPY);
    SelectObject(hBackDIBDC, pOldBmp);

//新建一个DC来拷贝目标区域
    HDC UpDC;                                                            
    UpDC = CreateCompatibleDC(hUpDC);
    HBITMAP UpBitmap ;
    UpBitmap = CreateCompatibleBitmap(hUpDC , nWidth , nHeight);
    HBITMAP hOldBmp1 =(HBITMAP)SelectObject(UpDC,UpBitmap);
    BitBlt(UpDC , 0 , 0 , nWidth , nHeight , hUpDC , rect.left , rect.top , SRCCOPY);

    //获取UpDC中的图形数据到BYTE数组
    HDC hUpDIBDC = CreateCompatibleDC(UpDC);
    
              

    BYTE * pBuffer1 = NULL ;
    HBITMAP hUpDIBitmap = CreateDIBSection(hUpDIBDC,
                                                      (BITMAPINFO *)&hdr,
                                                      DIB_RGB_COLORS,
                                                      (void **)&pBuffer1,
                                                      NULL,
                                                      0);

    HBITMAP pOldBmp1 = (HBITMAP)SelectObject(hUpDIBDC, hUpDIBitmap);
    BitBlt(hUpDIBDC,0,0,nWidth,nHeight,UpDC,0,0,SRCCOPY);
    SelectObject(hUpDIBDC, pOldBmp1);

   
    int PixelBytes = 3;

    for( int i = 0; i < nHeight;i ++)
   for(int j = 0; j < nWidth; j ++)
{
   BYTE btB = pBuffer[i * nWidth * PixelBytes   + j * PixelBytes ] ;
   BYTE btG = pBuffer[i * nWidth * PixelBytes   + j * PixelBytes + 1 ] ;
   BYTE btR = pBuffer[i * nWidth * PixelBytes   + j * PixelBytes + 2 ] ;

       BYTE btSB = pBuffer1[i * nWidth * PixelBytes   + j * PixelBytes ];
  
     BYTE btSG = pBuffer1[i * nWidth * PixelBytes   + j * PixelBytes + 1];

     BYTE btSR = pBuffer1[i * nWidth * PixelBytes   + j * PixelBytes ];
       
   btB = (BYTE) (btSB * Trans + (1-Trans) * btB);
   btG = (BYTE) (btSG * Trans + (1-Trans) * btG);
   btR = (BYTE) (btSR * Trans + (1-Trans) * btR);

   pBuffer[i * nWidth * PixelBytes   + j * PixelBytes ]     = btB ;
   pBuffer[i * nWidth * PixelBytes   + j * PixelBytes + 1 ] = btG ;
   pBuffer[i * nWidth * PixelBytes   + j * PixelBytes + 2 ] = btR ;

}
   StretchDIBits(hDC,rect.left,rect.top,nWidth,nHeight,
   rect.left,rect.left,nWidth,nHeight,pBuffer,(LPBITMAPINFO)&hdr,DIB_RGB_COLORS,SRCCOPY);

}

只有透过COLORREF rgbMask 透明色才能显示透明的效果。

/*
这是一个用来画透明位图的函数
CDC *pDC 需要画位图的CDC指针
UINT IDImage 位图资源ID
Crect &rect 指定位图在pDC中的位置
COLORREF rgbMask 位图的透明色

*/
void CGPS_eDogDlg::DrawTransparentBitmap(CDC *pDC, UINT IDImage,CRect &rect, COLORREF rgbMask)
{
CDC ImageDC,MaskDC;
CBitmap Image,*pOldImage;
CBitmap maskBitmap,*pOldMaskDCBitmap ;
Image.LoadBitmap(IDImage);
ImageDC.CreateCompatibleDC(pDC);
pOldImage=ImageDC.SelectObject(&Image);
MaskDC.CreateCompatibleDC(pDC);
maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );
ImageDC.SetBkColor(rgbMask);
MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );

ImageDC.SetBkColor(RGB(0,0,0));
ImageDC.SetTextColor(RGB(255,255,255));
ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);
MaskDC.SelectObject(pOldMaskDCBitmap);
ImageDC.SelectObject(pOldImage);
/*在OnPaint函数下的调用实例
void CDemoDlg::OnPaint()
{
   CPaintDC dc(this);
   Cbitmap BmpBack,*pOldBack,;
   BmpBack.LoadBitmap(IDB_BACKGROUND);

   CDC dcBack;
   dcBack.CreateCompatibleDC(&dc);
   pOldBack=dcBack.SelectObject(&BmpBack);
   dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
   DrawTransparentBitmap(&dc,IDB_BITMAPA,Crect(0,0,48,48),RGB(192,192,0));

   dcBack.SelectObject(pOldBack);}
*/
}

抱歉!评论已关闭.