作为操作系统的关键组成部分,GUI必须按硬件无关性设计,以便能够支持多种多样的显示硬件。如果不做任何抽象,按照VBE标准取得显卡的显存地址,直接进行显存写操作,这样的可移植性显然不高。毕竟VBE是基于PC的标准,其他的非PC硬件平台一般不支持这个标准。
把一个功能进行层次化划分,定义层次之间的接口,是实现可移植性的比较好的选择。但仅仅用层次化的方式隔离硬件实现和软件实现,也存在一些局限,比如不能同时支持多种硬件等。因此Hello China的GUI模块在设计的时候,综合利用了层次化的划分方法和面向对象的抽象方法,定义了一个名为Video的抽象对象,来实现对硬件的管理,同时实现软硬件的有效隔离。图11-1说明了这个架构。
图11-1 GUI模块的分层架构
每个层次的含义如下:
(1)显示卡等物理硬件层:这是纯粹的物理硬件设备,用于提供实际的显示和绘制服务
(2)Video对象层:系统中的每个显示设备,比如显示卡等,都会被抽象成一个Video对象,这样就可以适配系统中有多个显示设备的场景。由Video对象来实际操作对应的硬件,并向上层呈现统一的功能接口。Video对象层提供多个Video的管理功能,比如管理哪个Video对象是当前的默认输出对象,在有多个Video对象的时候,是采用镜像输出机制(每个Video对象输出相同的内容),还是采用拼接输出机制(每个Video输出部分内容,所有Video的输出,组成完整画面)。在V1.75的实现中,只能支持一个Video对象的输出,但后续版本可扩展到多个Video对象的同时输出和管理。(www.xing528.com)
(3)通用绘制层,该层是一个封装层,封装Video对象层的各个对象提供的功能,为核心窗口层提供统一的绘图服务。之所以增加这个层次,是因为在Video对象层中,可能存在许多个Video对象,而这些不同的Video对象所提供的服务可能不同。这样为了协调一致,对更上层呈现一个统一的调用界面,所以增加了这一层进行适配。
(4)核心窗口层,实现最核心的窗口机制。比如窗口的创建、绘制、销毁等操作,窗口消息的缺省处理、窗口的刷新等功能。这个层次是整个GUI部分的核心。
(5)通用控件层,即实现通用控件功能的层次。所谓的通用控件,就是组成GUI界面的按钮、菜单、编辑框、对话框等界面要素。这个层次基于核心窗口层功能,实现了很多预定义的通用控件,通过更加简洁的接口,提供给上层的应用使用。
(6)应用程序层,这就是具体的用户应用程序所在的层次。这个层次的代码,可以调用通用控件层提供的功能函数,来构筑基于应用的用户界面。这个层面完全是由应用程序实现的,严格来说,不算是操作系统GUI模块的一部分。
每个层次都是按照面向对象的思想,把相关功能划分为一个一个的对象来分别实现。比如核心窗口层,就通过一个WindowManager的核心对象来实现,统筹管理所有最底层的窗口功能。
接下来重点介绍Video对象层的功能和实现,其他层次会陆续展开描述。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。