在开发界面及棋牌游戏过程中,需要很多镂空的图片,而且图片形式一般比较固定.
所以封装了几种常见的镂空方法.
1. 用于没有掩码图,只有指定透明色,不进行伸缩
void
DrawTransBitmap( HDC hdcDest,
//
目标DC
int
nXOriginDest,
//
目标X偏移
int
nYOriginDest,
//
目标Y偏移
int
nWidthDest,
//
目标宽度
int
nHeightDest,
//
目标高度
HDC hdcSrc,
//
源DC
int
nXOriginSrc,
//
源X起点
int
nYOriginSrc,
//
源Y起点
COLORREF crTransparent
//
透明色,COLORREF类型
);
DrawTransBitmap( HDC hdcDest,
//
目标DC
int
nXOriginDest,
//
目标X偏移
int
nYOriginDest,
//
目标Y偏移
int
nWidthDest,
//
目标宽度
int
nHeightDest,
//
目标高度
HDC hdcSrc,
//
源DC
int
nXOriginSrc,
//
源X起点
int
nYOriginSrc,
//
源Y起点
COLORREF crTransparent
//
透明色,COLORREF类型
);
适用图片:
2. 用于没有掩码图,只有指定透明色,可以进行伸缩
void
DrawTransBitmap( HDC hdcDest,
//
目标DC
int
nXOriginDest,
//
目标X偏移
int
nYOriginDest,
//
目标Y偏移
int
nWidthDest,
//
目标宽度
int
nHeightDest,
//
目标高度
HDC hdcSrc,
//
源DC
int
nXOriginSrc,
//
源X起点
int
nYOriginSrc,
//
源Y起点
int
nWidthSrc,
//
源宽度
int
nHeightSrc,
//
源高度
COLORREF crTransparent
//
透明色,COLORREF类型
);
适用图片:同1,可拉伸
3.指定掩码图,和掩码图属于不同图片
void
DrawTransBitmap( HDC hdcDest,
//
目标DC
int
nXOriginDest,
//
目标X偏移
int
nYOriginDest,
//
目标Y偏移
int
nWidthDest,
//
目标宽度
int
nHeightDest,
//
目标高度
HDC hdcSrc,
//
源DC
HDC hdcMask,
//
掩码DC
int
nXOriginSrc,
//
源X起点
int
nYOriginSrc,
//
源Y起点
COLORREF crTransparent
//
透明色,COLORREF类型
);
适用图片:
和
4.指定图片和掩码图同属于一张图片
void
DrawTransBitmap(HDC hDC,
int
nPosX,
int
nPosY,
int
nCX,
int
nCY,
HBITMAP hObj
DrawTransBitmap(HDC hDC,
int
nPosX,
int
nPosY,
int
nCX,
int
nCY,
HBITMAP hObj
);
适用图片:
5.得到位图HRGN
HRGN CreateBitmapRgn(
int
nWidth,
int
nHeight,HBITMAP hbmp,COLORREF cTrans);
int
nWidth,
int
nHeight,HBITMAP hbmp,COLORREF cTrans);
适用图片:
以下是完整代码
//
用于没有掩码图,只有指定透明色,不进行伸缩
void
CCommon::DrawTransBitmap( HDC hdcDest,
//
目标DC
int
nXOriginDest,
//
目标X偏移
int
nYOriginDest,
//
目标Y偏移
int
nWidthDest,
//
目标宽度
int
nHeightDest,
//
目标高度
HDC hdcSrc,
//
源DC
int
nXOriginSrc,
//
源X起点
int
nYOriginSrc,
//
源Y起点
COLORREF crTransparent
//
透明色,COLORREF类型
)
...
{
HBITMAP hOldImageBMP, hImageBMP
=
CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);
//
创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP
=
CreateBitmap(nWidthDest, nHeightDest,
1
,
1
, NULL);
//
创建单色掩码位图
HDC hImageDC
=
CreateCompatibleDC(hdcDest);
//
临时DC
HDC hMaskDC
=
CreateCompatibleDC(hdcDest);
//
临时掩码DC
hOldImageBMP
=
(HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP
=
(HBITMAP)SelectObject(hMaskDC, hMaskBMP);
//
将源DC中的位图拷贝到临时DC中,源DC已经载入位图
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
//
设置临时DC的透明色
SetBkColor(hImageDC, crTransparent);
//
生成透明区域为白色,其它区域为黑色的临时掩码DC的掩码位图
//
位图来自临时DC
BitBlt(hMaskDC,
0
,
0
, nWidthDest, nHeightDest, hImageDC,
0
,
0
, SRCCOPY);
//
生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(
0
,
0
,
0
));
SetTextColor(hImageDC, RGB(
255
,
255
,
255
));
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hMaskDC,
0
,
0
, SRCAND);
//
透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(
255
,
255
,
255
));
SetTextColor(hdcDest,RGB(
0
,
0
,
0
));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC,
0
,
0
, SRCAND);
//
"或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC,
0
,
0
, SRCPAINT);
//
清理、恢复
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
//
用于没有掩码图,只有指定透明色,可以进行伸缩
void
CCommon::DrawTransBitmap( HDC hdcDest,
//
目标DC
int
nXOriginDest,
//
目标X偏移
int
nYOriginDest,
//
目标Y偏移
int
nWidthDest,
//
目标宽度
int
nHeightDest,
//
目标高度
HDC hdcSrc,
//
源DC
int
nXOriginSrc,
//
源X起点
int
nYOriginSrc,
//
源Y起点
int
nWidthSrc,
//
源宽度
int
nHeightSrc,
//
源高度
COLORREF crTransparent
//
透明色,COLORREF类型
)
...
{
HBITMAP hOldImageBMP, hImageBMP
=
CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);
//
创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP
=
CreateBitmap(nWidthDest, nHeightDest,
1
,
1
, NULL);
//
创建单色掩码位图
HDC hImageDC
=
CreateCompatibleDC(hdcDest);
HDC hMaskDC
=
CreateCompatibleDC(hdcDest);
hOldImageBMP
=
(HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP
=
(HBITMAP)SelectObject(hMaskDC, hMaskBMP);
//
将源DC中的位图拷贝到临时DC中
if
(nWidthDest
==
nWidthSrc
&&
nHeightDest
==
nHeightSrc)
...
{
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
}
else
...
{
StretchBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
}
//
设置透明色
SetBkColor(hImageDC, crTransparent);
//
生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC,
0
,
0
, nWidthDest, nHeightDest, hImageDC,
0
,
0
, SRCCOPY);
//
生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(
0
,
0
,
0
));
SetTextColor(hImageDC, RGB(
255
,
255
,
255
));
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hMaskDC,
0
,
0
, SRCAND);
//
透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(
0xff
,
0xff
,
0xff
));
SetTextColor(hdcDest,RGB(
0
,
0
,
0
));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC,
0
,
0
, SRCAND);
//
"或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC,
0
,
0
, SRCPAINT);
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
指定掩码图,和掩码图属于不同图片
void
CCommon::DrawTransBitmap( HDC hdcDest,
//
目标DC
int
nXOriginDest,
//
目标X偏移
int
nYOriginDest,
//
目标Y偏移
int
nWidthDest,
//
目标宽度
int
nHeightDest,
//
目标高度
HDC hdcSrc,
//
源DC
HDC hdcMask,
int
nXOriginSrc,
//
源X起点
int
nYOriginSrc,
//
源Y起点
COLORREF crTransparent
//
透明色,COLORREF类型
)
...
{
HBITMAP hOldImageBMP, hImageBMP
=
CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);
//
创建兼容位图
HDC hImageDC
=
CreateCompatibleDC(hdcDest);
//
临时DC
hOldImageBMP
=
(HBITMAP)SelectObject(hImageDC, hImageBMP);
//
将源DC中的位图拷贝到临时DC中,源DC已经载入位图
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
//
设置临时DC的透明色
SetBkColor(hImageDC, crTransparent);
//
生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(
0
,
0
,
0
));
SetTextColor(hImageDC, RGB(
255
,
255
,
255
));
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hdcMask,
0
,
0
, SRCAND);
//
透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(
255
,
255
,
255
));
SetTextColor(hdcDest,RGB(
0
,
0
,
0
));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcMask,
用于没有掩码图,只有指定透明色,不进行伸缩
void
CCommon::DrawTransBitmap( HDC hdcDest,
//
目标DC
int
nXOriginDest,
//
目标X偏移
int
nYOriginDest,
//
目标Y偏移
int
nWidthDest,
//
目标宽度
int
nHeightDest,
//
目标高度
HDC hdcSrc,
//
源DC
int
nXOriginSrc,
//
源X起点
int
nYOriginSrc,
//
源Y起点
COLORREF crTransparent
//
透明色,COLORREF类型
)
...
{
HBITMAP hOldImageBMP, hImageBMP
=
CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);
//
创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP
=
CreateBitmap(nWidthDest, nHeightDest,
1
,
1
, NULL);
//
创建单色掩码位图
HDC hImageDC
=
CreateCompatibleDC(hdcDest);
//
临时DC
HDC hMaskDC
=
CreateCompatibleDC(hdcDest);
//
临时掩码DC
hOldImageBMP
=
(HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP
=
(HBITMAP)SelectObject(hMaskDC, hMaskBMP);
//
将源DC中的位图拷贝到临时DC中,源DC已经载入位图
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
//
设置临时DC的透明色
SetBkColor(hImageDC, crTransparent);
//
生成透明区域为白色,其它区域为黑色的临时掩码DC的掩码位图
//
位图来自临时DC
BitBlt(hMaskDC,
0
,
0
, nWidthDest, nHeightDest, hImageDC,
0
,
0
, SRCCOPY);
//
生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(
0
,
0
,
0
));
SetTextColor(hImageDC, RGB(
255
,
255
,
255
));
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hMaskDC,
0
,
0
, SRCAND);
//
透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(
255
,
255
,
255
));
SetTextColor(hdcDest,RGB(
0
,
0
,
0
));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC,
0
,
0
, SRCAND);
//
"或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC,
0
,
0
, SRCPAINT);
//
清理、恢复
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
//
用于没有掩码图,只有指定透明色,可以进行伸缩
void
CCommon::DrawTransBitmap( HDC hdcDest,
//
目标DC
int
nXOriginDest,
//
目标X偏移
int
nYOriginDest,
//
目标Y偏移
int
nWidthDest,
//
目标宽度
int
nHeightDest,
//
目标高度
HDC hdcSrc,
//
源DC
int
nXOriginSrc,
//
源X起点
int
nYOriginSrc,
//
源Y起点
int
nWidthSrc,
//
源宽度
int
nHeightSrc,
//
源高度
COLORREF crTransparent
//
透明色,COLORREF类型
)
...
{
HBITMAP hOldImageBMP, hImageBMP
=
CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);
//
创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP
=
CreateBitmap(nWidthDest, nHeightDest,
1
,
1
, NULL);
//
创建单色掩码位图
HDC hImageDC
=
CreateCompatibleDC(hdcDest);
HDC hMaskDC
=
CreateCompatibleDC(hdcDest);
hOldImageBMP
=
(HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP
=
(HBITMAP)SelectObject(hMaskDC, hMaskBMP);
//
将源DC中的位图拷贝到临时DC中
if
(nWidthDest
==
nWidthSrc
&&
nHeightDest
==
nHeightSrc)
...
{
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
}
else
...
{
StretchBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
}
//
设置透明色
SetBkColor(hImageDC, crTransparent);
//
生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC,
0
,
0
, nWidthDest, nHeightDest, hImageDC,
0
,
0
, SRCCOPY);
//
生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(
0
,
0
,
0
));
SetTextColor(hImageDC, RGB(
255
,
255
,
255
));
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hMaskDC,
0
,
0
, SRCAND);
//
透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(
0xff
,
0xff
,
0xff
));
SetTextColor(hdcDest,RGB(
0
,
0
,
0
));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC,
0
,
0
, SRCAND);
//
"或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC,
0
,
0
, SRCPAINT);
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
指定掩码图,和掩码图属于不同图片
void
CCommon::DrawTransBitmap( HDC hdcDest,
//
目标DC
int
nXOriginDest,
//
目标X偏移
int
nYOriginDest,
//
目标Y偏移
int
nWidthDest,
//
目标宽度
int
nHeightDest,
//
目标高度
HDC hdcSrc,
//
源DC
HDC hdcMask,
int
nXOriginSrc,
//
源X起点
int
nYOriginSrc,
//
源Y起点
COLORREF crTransparent
//
透明色,COLORREF类型
)
...
{
HBITMAP hOldImageBMP, hImageBMP
=
CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);
//
创建兼容位图
HDC hImageDC
=
CreateCompatibleDC(hdcDest);
//
临时DC
hOldImageBMP
=
(HBITMAP)SelectObject(hImageDC, hImageBMP);
//
将源DC中的位图拷贝到临时DC中,源DC已经载入位图
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
//
设置临时DC的透明色
SetBkColor(hImageDC, crTransparent);
//
生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(
0
,
0
,
0
));
SetTextColor(hImageDC, RGB(
255
,
255
,
255
));
BitBlt(hImageDC,
0
,
0
, nWidthDest, nHeightDest, hdcMask,
0
,
0
, SRCAND);
//
透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(
255
,
255
,
255
));
SetTextColor(hdcDest,RGB(
0
,
0
,
0
));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcMask,