18.6 窗口服务器和控件环境API的更多知识
现在,终于到了回顾窗口服务器和控件环境提供的类以及它们是如何影响应用程序框架的时候了。
18.6.1 应用程序与窗口服务器的通信
在每个Symbian操作系统GUI应用程序中,4个系统提供的框架类用于确保应用程序可以正确与窗口服务器进行通信(见图18.6)。
RWsSession(在 w32std.h中定义):窗口服务器会话提供了应用程序与窗口服务器的客户-服务器会话。所有的窗口服务器类(窗口组和窗口)均使用该会话与窗口服务器进行通信。该会话也拥有应用程序的客户端缓冲,绘图和窗口操作命令在发送到服务器执行之前集中在这里。
RWindowGroup(在 w32std.h中定义):窗口组是应用程序整个窗口层次顶部窗口的客户端版本。窗口组与键盘焦点相关联。
CCoeEnv(在 coemain.h 中定义):控件环境基类封装了活动对象中的窗口服务器会话,当从窗口服务器接收事件时,将调用它的RunL()成员函数。这些RunL()函数分析事件,并调用框架函数来处理它们。控件环境为图形程序建立清理栈,它还包含许多有用的实用函数。
CCoeAppUi(在coeaui.h中定义):应用程序UI基类为第一级按键事件分布处理控件栈。应用程序UI还执行其他一些附带的函数。
控件环境为清理处理(清理栈)和事件处理(活动规划器)提供了先决条件。它将窗口服务器会话API封装在两个活动对象中,以处理窗口服务器生成的事件。从第6章可见,在GUI程序中,所有事件处理—键、触笔、重绘等—均发生在活动对象的RunL()中。
在这两个活动对象中,具有较高优先级的活动对象处理用户启动的事件,具有较低优先级的活动对象处理重绘事件。如果用户输入和重绘事件发生的同时,框架正处理前一个用户输入事件,那么它将首先处理用户输入事件。在其他方面,对于应用程序开发人员来说,这两个活动对象的使用没有任何区别。
有关这方面的设计,有一段有趣的历史。在Symbian操作系统开发早期,仅使用了单个活动对象,于是自然而然地从 CActive直接派生 CCoeEnv。但随着第二个活动对象的创建,重绘事件流与用户输入事件流分离开了。结果,CCoeEnv“继承一个”CActive(对于用户事件),同时,也“聚合一个”CActive(对于重绘事件)。如果从头开始设计,而不是后期修改,CCoeEnv 必定会具有两个活动对象。这是学习本书其他章节中所讲述的两条指导原则的典型范例:不要在拥有权将起作用的地方使用继承、对接口要隐藏活动对象。
【责任编辑:
董书 TEL:(010)68476606】