分类: C/C++
2009-08-04 14:22:03
Symbian OS 有很多种窗体(windows),但所有的窗体都有一个序号(orddianl position)和一个父窗体,其父窗体的行为在窗体的基类中定义,RWindowTreedNode是所有窗体类的抽象,这个抽象两大类窗体的行为:
RWindowBase 是可显示窗体的抽象。可显示窗体又分为两类:
通过下面的类图,可以清晰地看出各种窗体的关系。
下面对窗体相关的概念分别作一简单介绍。
窗体组(Window Groups)和应用程序:窗体组是应用程序的基本单元,其主要有以下功能:
· 接受键盘焦点事件;所有的键盘事件都会被发送到具有键盘焦点的窗体组,除非有事件被截获。
· 具有键盘焦点的应用程序即前台应用程序,会获得Window Server给与的特殊线程优先级,从而可以相应用户的请求,即使有后台应用程序在执行任务。
· 控制优先键及捕获键的配置。
· 窗体组具有名字,能够被Window Server客户端枚举查询,从而可得到正在运行的应用程序。
· 具有文本光标。仅当应用程序获得键盘焦点时,文本光标才能被显示出来。
· 对应用程序的所有窗体组成一个组。
一个典型的应用程序具有一个窗体组(windows group),其所有的窗体都属于这个窗体组。系统程序(system shell applicaiton)可以使用RWsSession接口来枚举所有客户端应用程序的所有窗体组。对于窗体组的命名,所有的应用程序应该使用相同的策略,这是GUI的职责,并非Window Server。
可显示窗体
RWindowBase 类是所有可显示窗体类的抽象。可显示窗体又进一步分为两类:可画窗体(RDrawableWindow抽象类)和空白窗体(RBlankWindow类)。
可显示窗体引入一下几个属性和功能:
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),它是所有窗体组的父窗体。从下图可以清晰看出窗体间的关系:
窗体间关系有以下属性:
如果一个窗体有多个子窗体,这些子窗体称为兄弟(siblings),兄弟窗体在一个列表中维护,父窗体有指向列表头的链接。窗体在列表中的顺序就是前面提到的窗体序号(ordinal position)。这个序号决定了顶置窗体的顺序。
窗体序号(ordinal position)
Window Server中所有的窗体都有一个序号,从视图最近到最远依次排序。每个窗体的序号是相对于其父窗体的,并且在兄弟窗体中是唯一的。
这个序号是从0开始的正整数,0表示最前面的位置。序号为0的窗体在前台显示,即在其所有兄弟窗体之前。其后的窗体序号依次递增。
当窗体创建时,在其父窗体中自动分配一个序号为0,当另一个窗体被创建时,第一个被创建的窗体序号变为1,新创建的窗体序号为0。窗体创建后,也可以使用RWindowTreeNode类的相关方法改变其序号。改变窗体序号会影响RWindowTreeNode::Parent(), RWindowTreeNode::Child(), RWindowTreeNode::NextSibling() 和RWindowTreeNode::PrevSibling()的结果。
下面的图例可以帮助理解窗体序号。图中有三个窗体,A,B和C,它们同属于一个窗体组,它们的序号分别为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。
全序号通常只对窗体组由意义,尽管其它窗体也有全序号。其他窗体不会特别地给一个不同的优先级,因此,通常窗体的全序号与序号相同。