RT-Thread的图形界面组件

发布于 2008-06-01 21:46:44
RT-Thread的图形界面组件:RTGUI

RTGUI的结构依然采用的是C/S结构,这样做的目的也是为了以后方便扩展到微内核结构。但和传统的C/S结构非常不相同的是,它采用的是
服务端:仅仅维护各面板、窗体的位置信息;及鼠标、键盘、触摸点事件的派发。
客户端:在自己的可显示区域上进行直接的、非常直接的屏幕直接写屏。

而对嵌入式系统着重优化的地方,引入面板概念
面板,一个完整的屏幕是由数个相互不重叠的面板构成,在面板自己所属的可视区域内,绘图几乎可以畅通无阻的自由绘画:独占可视区域。

但窗口的概念依然被保留下来了,并取其精华去其糟粕:
窗口永远位于面板的上方:为消息窗口保留、为输入法状态条保留
窗口几乎无最大化最小化的概念:因为嵌入式设备有限的面积决定了窗口的大或小并不是十分重要

RTGUI.JPG

查看更多

关注者
0
被浏览
4.3k
2 个回答
bernard
bernard 2008-06-13
RTGUI的Alpha绘图支持
RTGUI Alpha支持构思了很久。因为Alpha绘图(即透明模式绘图)是现代GUI的基本特性之一,其视觉特性效果显著,RTGUI对alpha的支持是必需具备的。

    Alpha混合操作
    [/list:u]
    原像素点:pixel_old,它由r, g, b三种色彩构成
    欲进行Alpha混合绘制的像素点:pixel,它除了r, g, b之外,应该指定alpha的效果是多少,例如说执行80%的透明效果,alpha=0.8
    那么要实现alpha混合绘制,应该在原来位置上填充的像素点为:
    pixel_new.r = pixel_old.r * alpha + pixel.r * (1 - alpha)
    pixel_new.g = pixel_old.g * alpha + pixel.g * (1 - alpha)
    pixel_new.b = pixel_old.b * alpha + pixel.b * (1 - alpha)


      RTGUI的Alpha支持
      [/list:u]
      RTGUI的实现和传统的GUI有着非常大的差别,其差别体现在:RTGUI虽然也采用客户端/服务端模式的体系结构,但它把传统服务端执行的绘图全部放到了客户端执行,而服务端仅仅保留客户端窗口信息及其剪切相关的信息,即客户端仅仅在自己可视剪切域中进行绘图。这样就会产生一个问题,对一个窗口,如果它被其他窗口所剪切,那么被剪切的部分相对于原窗口将留下一个空洞(因为这块空洞是由剪切窗口负责绘图),如果上层窗口需要实现Alpha效果,那么是不可能的,因为按照上面的alpha绘图公式,pixel_old像素点不能获得。

      为了在RTGUI中加入Alpha支持,RTGUI服务端中将加入相关信息以指明哪个窗口需要执行透明操作(RTGUI中view应该不存在这种问题,而且如何实现alpha将完全是view客户端的事情)。因为RTGUI服务端会保存有所有窗口的列表(可视窗口列表和隐藏窗口列表,可视窗口列表也即Z序),这个窗口列表的节点中将新增一项field以指明此窗口是否是透明窗口。

        涉及透明窗口的操作
        [/list:u]

          剪切域更新,目前的实现是从最上端的窗口一直更新到最底端的窗口。加入alpha后,那么当遇到是透明窗口时:(1)在透明窗口上的窗口剪切域需要发送给透明窗口(因为针对透明窗口,其上层的非透明窗口是能够显示并不透明);(2)透明窗口之下的窗口不应包含透明窗口的剪切域。[/*:m]
          当一个窗口更新时(窗口绘图完成时),如果此窗口之上存在透明窗口,需要发送Paint事件给透明窗口通知它需要重新刷新,即从新绘制透明窗口。[/*:m]
          透明窗口绘图时,先绘图到自己的dc buffer中,然后从dc buffer统一刷新到dc hardware。[/*:m][/list:u]

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友