void TransparentBlt2( 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, // 源高度 UINT 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, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY); //设置透明色 //透明色就是指在绘制一张图片的时候,该颜色的像素不会被绘制上去 SetBkColor(hImageDC, crTransparent); // 生成透明区域为白色,其它区域为黑色的掩码位图???----生成hMaskDC //BitBlt内的最大限制是两个设备内容必须是兼容的。这意味着或者其中之一必须是单色的,或者两者的每个图素都相同的位数。 //当目标文件是单色时,Windows 把彩色源转换成单色。在这种情况下,彩色位图中所有和背景色一致的象素都变成1,其他的象素都被转换成0。 BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 生成透明区域为黑色,其它区域保持不变的位图???----生成hImageDC //设置背景色为黑色0,前景色为白色1,与生成的掩码位图相与 //单色源位图与彩色目标图逻辑操作前,单色源位图中白色1部分先转换成目标图的背景色然后进行逻辑运算,单色源位图中黑色0部分转换成目标图的前景色然后再进行逻辑运算。 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); } /* 单色到彩色的转换 透明仿真也牵涉到基于Windows的单色位图到彩色位图的转换机制。反之亦然。基于Windows的文本前景色和背景色的概念被用于在两种格式之间进行转换。 在对一彩色目标文件进行位传递操作的时候,一 单色的源位图(和/或当可应用时一个画刷)在实际的光栅操作(ROP)中在这一位上实现之前被转换成背景色。 相反的,当目标文件是单色时,Windows 把彩色源转换成单色。在这种情况下,彩色位图中所有和背景色一致的象素都变成1,其他的象素都被转换成0。 因为下面所要涉及到的例子都使用单色屏蔽,所以对一个应用程序而言,在执行块操作之前正确地设置背景色和前景色是非常重要的。 ===================== 可还是不明白:“单色的源位图在实际的光栅操作(ROP)中在这一位上实现之前被转换成背景色” 单色源位图中有白色和黑色,是黑、白都转换成背景色吗?还是单单白色? 是不是应该这样理解: 单色源位图与彩色目标图逻辑操作前,单色源位图中白色部分先转换成目标图的背景色然后进行逻辑运算,单色源位图中黑色部分转换成目标图的前景色然后再 进行逻辑运算。 这样理解符合运算结果! */