注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

deisp的博客

 
 
 

日志

 
 

VC知识库BLOG-hATEmATH的网上田园- Linux下MiniGUI平台的透明位图的实现方法  

2008-09-11 13:00:14|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
公告
留言簿(13)

随笔分类

随笔档案

文章分类

文章档案

相册

工具网站

搜索
不错,呵呵。 --绞肉机配件 漂亮 --Petroleum Machinery 不错,机箱后面一张MM张片不错-.-! --快乐小胖鸟 漂亮。赞一个。小心EA找你收logo的版权费哦 --zgf的blog
电子邮件都是这个编码~
--玻璃小屋 恩。 --sjdev 跟进去单步运行一下,看看到哪步死的。我是xp+vs6环境 --hATEmATH 对不负责任的垃圾评论一律删无赦 --hATEmATH --海贝壳 谢谢,离吃喜糖还有一段时间呢,呵呵。 --hATEmATH 恭喜啊。看来要吃喜糖了 --changroc 呵呵,谢谢changroc --hATEmATH 对,这本书很实用的说 --zdd --Diviner --小明 小問題 --gatay 非常感谢! --||||||||||||||| 这本书写得还是马马虎虎的,比较实在。比那些什么陷阱和优化的书有用不少。 --Diviner 哈哈 --gaoqing000 --bwb
阅读排行榜评论排行榜

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


转载请注明原创出处:HateMath的网上田园(http://blog.vckbase.com/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在线杂志上的文章:《实例解说双缓冲》 (http://www.vckbase.com/document/viewdoc/?id=1612)

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


(完)

#re: Linux下MiniGUI平台的透明位图的实现方法 gaoqing000
Posted @ 2007-12-04 09:16
啊,这是嵌入式吗



引文来源  VC知识库BLOG-hATEmATH的网上田园- Linux下MiniGUI平台的透明位图的实现方法
  评论这张
 
阅读(386)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018