这几天闲来无事想写一个播放器的界面,但需要GDI透明绘图的知识,找了一些资料,但理解的不是很清楚。
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND)
比如上面的函数中源DC是一个单色位图,目的DC是一个彩色位图,如何进行与操作呢?
假设目的DC用4位表示一个像素,且整张位图只有2个像素,像素值分别为 1011 0011
而源DC是一张单色位图,也只有两个像素,分别为 1 0
很显然二者像素的位数不相同,那么如何进行与操作呢,如果不进行变换,直接相与,即
1&1011 = ? ,0&0011 = ?这会是什么结果呢?
在网上搜了很多资料才找到合理的解释,那就是bitblt这个函数会自动检测源和目的dc位数是否相同,
如果不同则会进行一些转换,怎么转换呢?这就要用到SetTextColor、SetBkColor两个函数了。
在单色位图转换为彩色位图时,需要知道彩色位图中什么是背景色,然后将黑白图中的白色转换成彩图中的背景色,
黑色转换为彩图中的前景色。例如上面的例子,如果彩色位图背景色是1001,前景色是0101
那么单色位图将会被首先转换为,含有1001 0101两个像素的彩色位图,然后再和目标彩色位图进行位操作,即
1001 & 1011= 1001 ,0101 & 0011 = 0001
这样理解就OK了,至于彩色位图转换为单色位图就比较简单了,SetBkColor来告诉彩图什么颜色设置为白色,
其他颜色一律设置为黑色,然后再进行位操作。
有了这些基础知识,就比较容易理解透明位图的制作原理啦。。。^_^