linux qt画透明图片,Linux下MiniGUI平台的透明位图的实现方法

Linux下MiniGUI平台的透明位图的实现方法

转载请注明原创出处:HateMath的网上田园()

名词解释: MiniGUI:

相对于PC机,嵌入式系统的资源往往很有限,很难用诸如XWindow这类重量级的东东进行图形用户界面的支持。MiniGUI应时而出,为嵌入式操作系统建立了一个快速、稳定和轻量级的图形用户界面支持系统。更多见官网:

为什么需要透明位图?

位图的轮廓都是方形的,可是我们经常需要形状不规则的图,比如要实现一只蝴蝶在草丛间飞舞的效果,用蝴蝶和草丛的位图进行简单叠加肯定是不行的---蝴蝶边上的背景怎么办?

解决之道     在PC传统的GDI环境下,使用位图和掩模异或的方法堪称经典,此类资料实在太多,不在此浪费口水了。这里主要讲讲MiniGUI下更简便的实现方法:SetMemDCColorKey()

SetMemDCColorKey()是基于NEWGAL的高级GDI函数,原型如下:

BOOL GUIAPI SetMemDCColorKey ( HDC  mem_dc,       // The device context

DWORD  flags,      // The color key specific memory DC flags.

Uint32  color_key   //The color_key of the memory DC.

)

mem_dc是内存设备环境的句柄;

flag在设置透明色时,取 MEMDC_FLAG_SRCCOLORKEY,要取消透明色设置,可将flags设置为0;

color_key 是MiniGUI中的颜色变量,代表想要设置为透明的颜色。函数调用成功返回TRUE,失败返回FALSE。

这个函数用来设置一个内存设备环境中的透明色。在将内存设备环境中的位图BitBlt到目标DC时,MiniGUi会跳过和透明色一样颜色的像素,也就是说,目标DC上对应位置处的像素值不变(不被覆盖)。

这样说太过于技术化了!HateMath一直认为,技术本身是严谨的,但其表现形式应该是生动有趣的。我们还是用形象的语言来表述一下吧:想像窗口是一个桌子,内存DC是桌布,没有使用SetMemDCColorKey()之前,BitBlt函数直接将整个桌布蒙在桌子上,而使用了SetMemDCColorKey()指定桌布上某些部分为透明色后,BitBlt会把桌布上的这些地方统统剪个洞,再蒙到桌子上。桌子上对应透明色的位置是不被覆盖的。

这样一来,前面提到的问题就迎刃而解了。

详细的步骤如下:

0. 将蝴蝶身体以外的像素都用某一种颜色A(当然是和蝴蝶不一样的颜色)填充

1. 在窗口DC上画草丛的位图 (用到的GDI函数: FillBoxWithBitmap,  )

2. 创建内存DC,依次在上面画草丛位图和蝴蝶位图 (CreateCompatibleDC, FillBoxWithBitmap)

3. 设置颜色A为内存DC中的透明色,再通过BitBlt把内存DC内容输出到目标DC(一般是窗口的DC)上 (SetMemDCColorKey, BitBlt)

注意操作完成后要要取消透明色设置,否则程序会崩溃。上面说的是问题的基本思路,具体实现起来时,还可以根据实际情况进行优化。比如用双缓冲防止绘图时闪烁。关于双缓冲绘图可参见我在vckbase在线杂志上的文章:《实例解说双缓冲》 ()

最后想补充一句,如果不是要求必需使用位图,其实还有更简单的方法实现图片的透明:png图片。当在MiniGUi中加载了png格式的图片时,该透明的地方是透明的(不要用ACDSee3.0编辑png图片)。我原来用的是SetMemDCColorKey,现在改用png的方案,效果也很好。下面是圆角图标示例:

%E9%80%8F%E6%98%8E%E4%BD%8D%E5%9B%BE.JPG

(完)

posted on 2007-11-30 16:27 hATEmATH的网上田园 阅读(1721)

--------------------next---------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值