如何在memdc中绘字?要求修改透明通道
如题,我在使用uplayeredwindow的时候,要求提供一个memdc,我在memdc中绘制一张透明的图,然后使用DRAWTEXT绘字,但是drawtext绘字后,最终出现在桌面上的图,几乎是全透明的,但能看到很模糊的字影。
在做按钮倒影的时候也遇到过这个问题,我发现drawtext会把绘字区域的透明通道部分区域置0(就是透明),而我想要的是绘字区域的透明通道值为255、
我也尝试过先drawtext到另一个dc,然后再将字用transparentblt绘制出来到memdc中,但是因为需求memdc中的透明通道,所以使用alphablend从memdc绘制到paintdc后,依然是绘字部分几乎是全透明的,但能看到很模糊的字影,因为transparentblt不修改透明通道。 即使从memdc中bitblt出来(不使用透明通道 ),你也会发现字是模糊的。
而且我发现一个问题,memdc中getcurrentbitmap,获取图像缓冲区,其结构是,
RGB+A 4字节 RGBA。。。。。。。。。
。。。。。。。。
。。。。。。
,这样的缓冲区总大小是 imgwidth*imgheight*4,并且我也验证过
但是我发现虽然
“
画图函数不一定会改变hdc透明通道值,那么这种函数也不会理会图像的透明度
透明通道的作用有2个:
1.累积本hdc透明通道的值,为2做准备
2.提供给 会改变透明通道的函数 hdc的透明通道值
因为hdc中的图像已经是经过计算的值,在画在其他dc上时,不会再乘以 alpha/255 .
alpha贴图计算方式 背景A点像素*(255-前景图像素对应点的alpha)/255+前景图像素对应点*前景图像素对应点的alpha/255,所以说贴图跟背景图的alpha没关系
如果绘图函数会修改透明通道,那么修改的公式为 背景图alpha+(255-背景图alpha)/255*前景图对应点的alpha。
比如背景图的 alpha=64,前景图的alpha=12,那么修改后的透明通道值为64+9=73.
”
但是也动设置缓冲区的数据,跟调用绘图函数是有差别 ,
比如,最显然的,你即使将透明通道全部置0,使用alphablend也能绘出图,虽然是很模糊的,但是不是全透明的,
除非你将整个数据区清0;求解,这是为什么。
[解决办法]
用GDI+