TransparentBitmap函数设置透明位图的原理分析

来源:互联网 发布:java怎样显示输入框 编辑:程序博客网 时间:2024/05/20 05:07

1、函数的功能:把一张位图设置成透明,不影响背景图的显示,并可改变大小

2、函数的思想:

  (1)以当前的hdc创建5个设备兼容dc(HDC):hMem,hSave,hBack,hObject,hTemp
  (2)将要透明处理的位图块选入其中一个hTemp,获取宽高,并转换成逻辑点值;
  (3)创建4个临时位图(HBITMAP):bmMem,bmSave,bmBack,bmObject
    其中bmMem和bmSave为设备兼容位图,bmBack和bmObject为单色位图
  (4)将创建的临时位图分别选入临时DC中,效果图如下:

图1 原位图
  (5)设置选入过位图块的hTemp的映射模式,并保存到hSave;
  (6)将hTemp的背景色设置为要透明的颜色,在原样拷贝到hObject,创建目标屏蔽码,
     然后恢复源DC(hTemp)的原始背景色;

图2 目标屏蔽码位图

  (7)创建反转的目标屏蔽码:将hObject中的目标屏蔽码取反,然后拷贝到hBack中;

               
               图3 反转的目标屏蔽码
  (8)拷贝主DC的背景到目标DC:hdc→hMem;(SRCCOPY)

                    

               图4 主屏幕该位置处的背景位图
    屏蔽位图的显示区:hObject→hMem;(SRCAND)

               

               图5 目标屏蔽码屏蔽背景位图
    屏蔽位图中的透明色:hBack→hTemp;(SRCAND)

                   

               图6 反转屏蔽码屏蔽位图中的透明色后的结果
    将位图与目标DC的背景做异或操作:hTemp→hMem;(SRCINVERT)

                         

               图7 图6与图5异或操作的结果
    拷贝目标到屏幕上:hMem→hdc;(SRCCOPY)(改变大小在此步骤中用StretchBlt)

                            

               图8 拷贝到屏幕该位置的局部效果(未改变大小)
    恢复原始位图:hSave→hTemp;(SRCCOPY)
  (9)删除临时内存位图,删除临时内存DC;


1 0
原创粉丝点击