TransparentBlt是系统的API函数,用于在两个DC之间进行掩码色贴图。其函数原型如下:
BOOL TransparentBlt(
HDC hdcDest, //目标DC的句柄可以通过hdcDest .m_hDC获取
int nXOriginDest, //指定目标矩形左上角的X轴坐标,坐标以逻辑单位表示
int nYOriginDest, //指定目标矩形左上角的Y轴坐标,坐标以逻辑单位表示
int nWidthDest, //指定目标矩形的宽度
int hHeightDest, //指定目标矩形的高度
HDC hdcSrc, //源DC的句柄可以通过hdcSrc .m_hDC获取
int nXOriginSrc, //指定源矩形(左上角)的X轴坐标,坐标以逻辑单位表示
int nYOriginSrc, //指定源矩形(左上角)的Y轴坐标,坐标以逻辑单位表示
int nWidthSrc, / /指定源矩形的宽度
int nHeightSrc, //指定源矩形的高度
UINT crTransparent //掩码色
);
在使用该函数进行贴图的过程中发现图片总是贴不上,后来查看MSDN得知该函数如果执行成功会返回TRUE,如果失败则会返回FALSE;
于是尝试写判断语句看函数能否成功执行
if(!TransparentBlt(dc.m_hDC,0,0,rc.Width(),rc.Height(),m_dc.m_hDC,0,0,,rc.Width(),rc.Height(),RGB(255,255,255)))
{
AfxMessageBox("error");
}
发现总是不能执行成功,在测试的时候发现如果将源矩形变小不超过图片大小成功,则执行成功
于是改进代码,通过位图结构体关联CBITMAP获取图片大小
BITMAP bm;
m_bmp.GetBitmap(&bm);
if(!TransparentBlt(dc.m_hDC,0,0,rc.Width(),rc.Height(),m_dc.m_hDC,0,0,bm.bmWidth,bm.bmHeight,RGB(255,255,255)))
{
AfxMessageBox("e");
}
总结:在使用 TransparentBlt 的过程中需要判断是否执行成功后再贴图,并且源 dc 矩形不得超过图片的矩形大小