3.9 窗口的属性
在本节中,我将讨论不同窗口类的部分属性。除了根窗口,它在WSERV启动时创建,所有其它窗口根据WSERV客户端的请求创建。客户拥有他们自己创建的窗口。拥有者可以控制窗口的某些属性,而其他被赋予WSERV。
3.9.1 所有窗口都拥有的属性
所有窗口都拥有的属性包括:
l 父窗口
l 最年长或第一个子窗口
l 下一个兄弟窗口
l 客户端句柄
l 优先级顺序
在前面几节我已经讨论了前三个属性。客户端句柄是窗口拥有者创建窗口时给予WSERV的一个值。这个值在所有的客户端拥有的窗口中保持唯一性是非常重要的,否则客户端代码将无法如预期正常工作。在调试版本中, WSERV强制执行这个值的独特性检查,如果有重复的就会Panic客户端。
优先级顺序与窗口的另一项称为位置顺序的属性是密切相关的。优先级顺序由一个窗口的拥有者设置并存储在服务器端。位置顺序关注在同一个父窗口中的几个子窗口的位置。此值未显式存储,但可以通过分析在服务器端的窗口类结构计算出来。The rule is that if two children of
the same parent have different ordinal priority then the one that has the
highest will always be older and therefore in front of the one with the
lowest. If we have a group of children, all with the same priority, then
their ordinal position will start at zero and increase through consecutive
positive integers. For example, suppose that a window has five children,
two of ordinal priority ten and three of ordinal priority zero. Then the two
with ordinal priority ten will be the oldest, and in front of the others, and
their ordinal positions will be zero and one. Similarly, the three of ordinal
priority zero will have ordinal positions zero, one and two.
One use of ordinal priority is to make sure a group window comes
in front (or behind) other group windows. For example, the group window
associated with the application picker in the UIQ interface has a
negative ordinal priority to ensure that it appears behind all the normal
applications, which by default have zero for their ordinal priority.
3.9.2 窗口组的属性
窗口组的属性包括:
l 名称
l 标识符
l 屏幕设备
标识符是一个1到10000之间的数值,由WSERV赋值给每一个组窗口。在任何给定的时间,这个值对所有的组窗口来说是唯一的;当一个组窗口被销毁时,它们将被循环分配,但是它的标识符立刻被重用的可能性却不大。标识符给予了系统中应用程序在任何时候找到所有窗口组的方法。RWsSession中的API使用标识符作为应用窗口组的方法:
这些函数容许窗口组被列出,被查询以及被重新排序。
在RWindowGroup类中有两个API函数用于设置和获取一个窗口组的名称。另外,在RWsSession类中也有一个API函数:
窗口组名称被使用,这样系统就能取到当前运行的应用程序的列表。
对一个WSERV客户端来说,创建一个屏幕设备CWsScreenDevice是很平常的,这个对象在服务器端有一个对应的对象DWsScreenDevice。客户端创建的第一个屏幕设备将成为这个客户端的首要屏幕设备。这个屏幕设备将被赋值给客户端创建的每一个窗口组。首要屏幕设备创建之前的窗口组将不会和任何一个屏幕设备相关联。
窗口组与相关联的屏幕设备之间有多个屏幕尺寸模式(未来,系统包含多个屏幕也是可能的)。在这种情况下,每个屏幕设备都有一个与之相关的屏幕尺寸模式。如果当前的系统屏幕尺寸与设备的屏幕尺寸不同,则WSERV将使所有的窗口组和它们的子窗口不可见。
3.9.3 客户端窗口属性
客户端窗口有两个屏幕模式和许多不同的区域
3.9.3.1 屏幕模式
两个屏幕模式(或色深)都与客户端请求的屏幕模式相关。其中一个是绘制模式,它指定了哪个颜色集合可以被绘制到窗口。另外一个模式是硬件模式,那是窗口能够正确显示的硬件可以切换到的最小模式。一个窗口可以请求它自己的绘制模式,但是WSERV缺省会给它在WSINI.INI文件的WINDOWMODE关键字指定的模式。WSERV用请求的模式和硬件实际可用的模式来计算窗口实际得到的模式。在Symbian OS中,色彩模式使用枚举TDisplayMode指定。根据它们是否是灰度还是彩色,以及包含的颜色数目,有一个命名约定。比如EColor64K有一个65536非灰度颜色的模式,这里下表是一个支持EColor4K和EColor64K的系统硬件可能赋予一个窗口的显示模式:
绘图模式根据一个请求而改变,除非它需要比硬件支持的更多的颜色数目。
3.9.3.2 区域
窗口有许多与它相关的不同区域。现在我将讨论其中的一些。在Symbian OS中,我们提供一个基类TRegion,它有若干个派生类。这个类中保存着一个用于描述一个二维区域的分离的矩形的列表。这些类有许多的操作函数,包括将区域进行累加的函数和求区域交集的函数。WSERV大量使用了这些类-这就是为什么我们推荐你将Symbian OS移植到新的硬件平台时使用机器码实现这些类。
区域计算是一个非常耗时的工作。正因为这样,WSERV在对区域进行计算后就会将计算结果缓存起来。然后下次使用时,它就会直接使用缓存的值。这当然也意味着当一个操作改变了其中一个缓存的区域时,WSERV必须将它们完全丢弃。
基本区域
这个区域是客户端用函数RWindowBase::SetShape指定的。然而,描述区域的矩形越多,窗口可见时需要的处理就越多。因此,圆形的或三角形的窗口将是特别低效的。
窗口缺省为矩形并与它们的父窗口是相同的大小。这意味着如果他们的父窗口是一个组窗口时,他们将是全屏幕的。它们的尺寸可以用函数SetSize()修改(定义在RWindow或RBlankWindow中)或SetSizeErr()函数。(定义在RWindowBase类中)。
可见区域
这个区域是WSERV为每个窗口计算出来的。这是一个窗口没有被其他任何窗口遮盖的部分。
无效区域
这是一个窗口的等待重绘的区域,在下列情况下区域可能需要重绘:
l 当另一个窗口被销毁或变为不可见时它们变为可见
l 它们的窗口被变为可见
l 它们的窗口被重新设置位置,导致它位于屏幕外面的部分被移回到屏幕内
l 部分窗口失去了阴影
l 它们的窗口渐渐显示出来
l 客户端在窗口上调用Invalidate()
只有RWindow实例可以有无效区域,由于WSERV知道如何绘制其他的窗口类型(参考随后的窗口绘制部分)。无效矩形必须保护在可视区域。
当一个窗口有无效区域时,则WSERV将给它发送一个重绘事件。客户端可以使用GetInvalidRegion()函数发现无效区域。
绘制区域
这是WSERV裁剪绘制的区域。根据窗口是否正在被重绘,有不同的计算方法。如果没有在被重绘,则绘图区域仅仅是可见区域减去无效区域。如果窗口被重绘,then the drawing area is the
area being redrawn (that is, the area validated by the redraw) less any
area that has become invalid since the redraw started.
阴影区域
这是当前处于阴影状态的窗口。当WSERV绘制到窗口时,它实际上会绘制两次。首先它会绘制到无阴影的窗口部分,然后再绘制阴影部分。第二次绘制时阴影标志将被设置。
3.10 绘制到窗口
在这部分,我将讨论绘制到窗口的不同方法,以及WSERV支持它们的机制。
3.10.1 空白窗口的绘制
WSERV为客户端处理所有空白窗口(RBlankWindow)的绘制。客户端可以用函数SetColor(TRgb aColor)为WSERV指定一个颜色值。绘制窗口时,WSERV会关注窗口可能会Fade的事实(通过调用RWindowTreeNode::SetFaded()或RWindowBase::FadeBehind()函数),窗口上也可能被投射了阴影。这意味着绘制一个空白窗口时,WSERV有可能使用4种不同的颜色。
3.10.2 绘制备份内容窗口
客户端请求这种类型的窗口必须实例化类RBackupWindow。这种窗口也被称为位图备份窗口,因为WSERV将窗口的内容保存在一张位图中,这样,当窗口就会变成无效时,WSERV可以从位图绘制它,而无需从窗口所有者得到任何协助。WSERV创建一个与窗口具有同样大小和颜色深度的位图,并使用此图映射窗口的内容。由于位图的存在,客户端建立窗口时必须指定窗口的颜色深度。如果客户端随后要改变窗口的大小,如果内存不足导致无法改变位图的大小,则操作可能会失败。