作者:中国嵌入式系统开发
实现两张图片叠加,半透明效果。
sdmmclogozx.bmp和sdmmclogohangsheng.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);}
*/
}