GDI透明绘图

这几天闲来无事想写一个播放器的界面,但需要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来告诉彩图什么颜色设置为白色,

其他颜色一律设置为黑色,然后再进行位操作。

有了这些基础知识,就比较容易理解透明位图的制作原理啦。。。^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值