Symbian OS应用编程图形篇之窗体

来源:互联网 发布:淘宝母婴用品代理 编辑:程序博客网 时间:2024/05/16 14:30

Symbian OS 有很多种窗体(windows),但所有的窗体都有一个序号(orddianl position)和一个父窗体,其父窗体的行为在窗体的基类RWindowTreedNode中定义,RWindowTreedNode是所有窗体类的抽象,这个抽象两大类窗体的行为:

  • 可显示窗体Displayable windows

       RWindowBase 可显示窗体的抽象。可显示窗体又分为两类:

    1. RBlankWindow空白窗体(blank windows
    2. RDrawableWindow可画窗体(drawable windows,可画窗体又分为两种,一种是标准的窗体(RWindow),另一种是Backed-up窗体,Window Server来维护,无须应用程序干预。
  • 窗体组(Window group),窗体组是名义上的窗体,不能再屏幕上显示,但它和其他窗体一样,同样具有序号和父子窗体及兄弟窗体这样的窗体关系。

 

通过下面的类图,可以清晰地看出各种窗体的关系。

 

 

下面对窗体相关的概念分别作一简单介绍。

 

窗体组(Window Groups)和应用程序:窗体组是应用程序的基本单元,其主要有以下功能:

 

·   接受键盘焦点事件;所有的键盘事件都会被发送到具有键盘焦点的窗体组,除非有事件被截获。

·   具有键盘焦点的应用程序即前台应用程序,会获得Window Server给与的特殊线程优先级,从而可以相应用户的请求,即使有后台应用程序在执行任务。

·  控制优先键及捕获键的配置。

· 窗体组具有名字,能够被Window Server客户端枚举查询,从而可得到正在运行的应用程序。

·  具有文本光标。仅当应用程序获得键盘焦点时,文本光标才能被显示出来。

· 对应用程序的所有窗体组成一个组。

 

一个典型的应用程序具有一个窗体组(windows group),其所有的窗体都属于这个窗体组。系统程序(system shell applicaiton)可以使用RWsSession接口来枚举所有客户端应用程序的所有窗体组。对于窗体组的命名,所有的应用程序应该使用相同的策略,这是GUI的职责,并非Window Server

 

可显示窗体

RWindowBase 类是所有可显示窗体类的抽象。可显示窗体又进一步分为两类:可画窗体(RDrawableWindow抽象类)和空白窗体(RBlankWindow)。

 

可显示窗体引入一下几个属性和功能:

  • 所有的窗体用一个矩形来定义它的范围,大部分窗体填充这个范围,但你可以设置圆角或在窗体范围内指定任意区域。
  • RWindowBase::SetVaisible()函数控制窗体是否可见。
  • 窗体定义是否备份在其后面的屏幕内容,使得窗体销毁或移动时屏幕内容可以重画。这个主要用于即时窗体,如对话框、菜单等。
  • 所有和鼠标(pointer)相关的事件控制。

 

Window Server 负责维护所有可显示窗体的显示,包括窗体的区域、层次位置、可见与否、阴影等。

 

 

标准窗体

 

RWindow类从RDrawableWindow派生,客户端应用程序必须重画这种窗体的无效区域。这类窗体内存耗用很低,因此,它是Symbian应用程序中最常用的窗体类型。

 

Backed-up 窗体

 RBackedUpWindow类实现了backed up window,这类窗体在一个备份的位图文件中维护其内容,从而使得在当其无效时,Window Server可以将其重现而不必给程序产生一个重画事件。


空白窗体(blank windows)/

RBlankWindow类实现了空白窗体。空白窗体有自己的位置、大小及颜色变化,但没有可画元素。空白窗体不提供RWindow类没有的功能,但它还是很有用的,例如当程序需要容器窗体时。

 

父窗体(Parent windows/兄弟窗体(Sibling windows

 

在一个运行的程序中,所有窗体都在一个分层结构中,每一个窗体有一个父窗体。Window Server有一个不属于客户端的窗体---根窗体(“root” window),它是所有窗体组的父窗体。从下图可以清晰看出窗体间的关系:

 

 


窗体间关系有以下属性:

  • 窗体在构造是指定父窗体。
  • Window Server没有强行限制一个窗体子窗体的数量,子窗体的数量仅受限于系统资源。
  • 当父窗体销毁时,其所有的子窗体从屏幕消除,但窗体对象并没有销毁,当窗体对象或客户端程序销毁时,它才会被销毁。
  • 窗体显示区域有其父窗体来定义,子窗体不能显示在父窗体之外,如果子窗体有部分被移到父窗体之外,父窗体之外的部分将不被显示。
  • 如果父窗体是窗体组(window group),窗体可以在屏幕任何地方显示,因为窗体组没有大小。

 

 

如果一个窗体有多个子窗体,这些子窗体称为兄弟(siblings),兄弟窗体在一个列表中维护,父窗体有指向列表头的链接。窗体在列表中的顺序就是前面提到的窗体序号(ordinal position)。这个序号决定了顶置窗体的顺序。

 

 

           

窗体序号(ordinal position)

Window Server中所有的窗体都有一个序号,从视图最近到最远依次排序。每个窗体的序号是相对于其父窗体的,并且在兄弟窗体中是唯一的。

 

这个序号是从0开始的正整数,0表示最前面的位置。序号为0的窗体在前台显示,即在其所有兄弟窗体之前。其后的窗体序号依次递增

 

当窗体创建时,在其父窗体中自动分配一个序号为0,当另一个窗体被创建时,第一个被创建的窗体序号变为1,新创建的窗体序号为0。窗体创建后,也可以使用RWindowTreeNode类的相关方法改变其序号。改变窗体序号会影响RWindowTreeNode::Parent(), RWindowTreeNode::Child(), RWindowTreeNode::NextSibling() RWindowTreeNode::PrevSibling()的结果。

 

下面的图例可以帮助理解窗体序号。图中有三个窗体,ABC,它们同属于一个窗体组,它们的序号分别为A=0, B=1, C=2.


 


 

如果它们的创建顺序是CBA,那么它们的序号就是缺省的设置的值。如果一个窗体的序号改变,其在屏幕上的位置会变,且其所有的子窗体也随之改变,尽管它子窗体的序号没变。

 

如果想顶置或后置一个窗体,只需改变其序号即可。

 

窗体组的优先级(Window Group Priority

 

窗体除了有一个序号外,还有一个优先级的概念。优先级缺省为0。窗体优先级的改变可以用来替代以窗体序号所定的窗体位置。尽管此概念可以应用于所有的窗体,但在实际应用中,我们通常只改变窗体组的优先级,并且只在特殊情况下使用。

 

窗体序号应用于同优先级的一组窗体中,如果一个窗体组有较高的优先级,那么它的位置就在较低优先级窗体之上,而不论其序号的大小。例如,一个窗体的优先级为1,其他的窗体组优先级为0,那这个窗体就会前置,并阻止了其他窗体的键盘捕获。

 

同理,如果窗体组的优先级是-1,其他窗体组优先级为0,则这个窗体组就不能获取键盘事件,也不能被前置,无论其序号是多少。这可以实现“墙纸”这样

的应用。

 

全序号(Full ordinal position

全序号是将窗体组的序号和优先级结合起来的一个序号,例如,一个窗体组A的优先级为0,序号为0,窗体组B的优先级为1,那么窗体组A的全序号是1,并不是0

 

全序号通常只对窗体组由意义,尽管其它窗体也有全序号。其他窗体不会特别地给一个不同的优先级,因此,通常窗体的全序号与序号相同。

 

 

 
原创粉丝点击