UCGUI中的实现透明窗体的原理.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
UCGUI中的实现透明窗体的原理

UCGUI中的实现透明窗体的原理 作者:UCGUI 邮箱:UCGUI@163.com 主页: 时间:2006-12-18 版本: v 版本 说明 时间 v 深入解析UCGUI透明窗体支持原理。 实现UCGUI上的半透明窗体效果 2006-12-18 摘要: 有很多朋友不太明白UCGUI中如何实现透明窗体,虽然有些朋友曾经讨论过UCGUI中透明窗体的实现,但涉及到对UCGUI核心结构的改动, 本文深入解析UCGUI的透明窗体的支持原理,从剪切处理以及重绘方面全面讲解透明窗体的支持要点,并着手修改UCGUI以达到半透明窗体的效果,并不改动UCGUI的上层源码,而仅仅将修改局限于底层的LCD图形驱动当中,无须更改UCGUI本身。 目录 一. 透明处理的本质. 二. UCGUI中透明窗体支持. 三. MemDev下实现透明窗体的问题. 四. 透明窗体是否仅绘图时进行透明处理即可? 五. 修改后的代码下载. 一. 透明处理的本质。 1.透明显示的原理. 假设一张图片A与B,如果B是透明的,其意即,透明B可以看到A,但并不是完全看到A,只是看到A的朦胧的影象。在图形处理上,其实就是在A上面再显示B的时候,对B上面的每个点的颜色做了处理,简单的说就是与A的颜色按比例进行了一个混合,混合的时候是按照R、G、G分别进行混合的. 2.透明显示的计算公式 alpha是透明度,亦即显示B时B的每个象素点与A的相同位置的象素点进行混合的比例系数,R(b)_new/G(b)_new/B(b)_new为计算所得的新的B要显示的象素点的R/G/B颜色分量,R(b)/G(b)/B(b)为B本来象素点要显示的象素点的R/G/B颜色分量,R(a)/G(a)/B(a)为A的点的R/G/B颜色分量. R(b)_new = R(b)*(1-alpha) + R(a)*alpha; G(b)_new = G(b)*(1-alpha) + G(a)*alpha; B(b)_new = B(b)*(1-alpha) + B(a)*alpha; 3.实现窗体透明显示面临的问题 经过这样合成之后,就可以获得B透明显示于A,即可以看到A又可以看到B的效果。但是这里其实也暗示了一个问题: 透明的图片B是在A的基础上显示的,即是在A显示之后再处理B,所以考虑一下我们下面要讨论的透明窗体: [1].窗体要透明,则必须总是在不透明的窗体之后绘制,不然就会被其它窗体挡住了,这是窗体Z序的问题。 [2].透明的窗体不会对一般窗体构成遮挡关系,这是窗体剪切计算时的问题. 下面我们就将讨论一下UCGUI中如何利透明显示的知道实现透明窗体. 二. UCGUI中透明窗体支持。 1.UCGUI中窗体的Z序. 为了帮助理解透明窗体在剪切时的处理,这里有必要介绍一下UCGUI中z序的知识.有的朋友以为UCGUI中没有Z序,其实在窗体的最基本的结构WM_Obj当中,就包含了Z序: typedef struct { GUI_RECT Rect; /* outer dimensions of window */ GUI_RECT InvalidRect; /* invalid rectangle */ WM_CALLBACK* cb; /* ptr to notification callback */ WM_HWIN hNextLin; /* Next window in linear list */ WM_HWIN hParent; WM_HWIN hFirstChild; WM_HWIN hNext; U16 Status; /* Some status flags */ } WM_Obj; hNextLin----------所有窗体的链表指针,将UCGUI中所有的窗体形成一个键表,便于查找窗体。 hNext-------------兄弟窗体的链表指针,这个成员其实就表示了兄弟窗体的Z序关系,hNext所指窗体Z序高. hParent-----------父窗体指体指针,父窗体被子孙窗体剪切. hFirstChild-------第一个子窗体指针,用于快速查找窗体的所有子窗体. Status------------窗体属性,如透明窗体/窗体是否可称动等. Z序-----按照通行的解释,就是除平面的X/Y轴,抽象出来表示窗体层次关系的Z轴,沿着Z轴Z序增高,Z序高的窗体挡住Z序低的窗体. 注:依我理解,表达更详细一点以及加深理解, 可以把Z序理解成多层概念: [1].兄弟窗体之间,Z序高的窗体高于Z序低的窗体的所有子孙窗体. [2].父子窗体之间,子孙窗体Z序高于父窗体,但子孙窗体的区域不能超过父窗体

文档评论(0)

baoyue + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档