通用绘制层是为了弥补Video对象功能不一而设置的。设想,有的Video对象自己实现了画椭圆算法,而有的Video对象则没有。这时候就需要通用绘制层来弥补这两者之间的差异了。如果Video对象实现了画椭圆功能,则通用绘制层会直接调用Video的画椭圆功能来完成椭圆绘制。否则,通用绘制层会使用自己的绘制算法,但是在绘制每个点的时候,仍然会调用Video对象的DrawPixel函数。当然,画点函数DrawPixel和MouseToScreen等功能,是每个Video对象都必须实现的。
通用绘制层为更上层功能(如核心窗口层)提供统一的绘制服务。表11-2是通用绘制层的一些最基本绘制函数。
表11-2 通用绘制层的基本绘制函数
通过这些简单的函数,读者可进一步理解通用绘制层为上层提供的绘制服务,同时也可以更深入地理解通用绘制层如何调用Video对象层的功能,来实现绘制功能。
需要说明的是,通用绘制层功能的当前实现,是存在缺陷的,就是没有考虑剪切域的问题。通用绘制层当前的实现,是可以在屏幕上任意位置进行输出的,只要你指定一个具体位置。但在很多情况下,是需要把输出限制在一个特定区域内的,比如一个固定窗口内。超出窗口的输出,将会被剪切掉。目前为了实现方便,没有在通用绘制层考虑剪切的问题,后续版本中会增加对剪切域的支持。即使没有剪切域的支持,目前的绘制功能也是比较完备的,可以满足大多数情况的需要。
GUI模块的绘制机制已解释完毕,相信读者应该有一个比较清晰的脉络了。在此做一下总结:
(1)通过直接写显存的方式,实现对显卡的操作。使用VESA的VBE标准,对显卡进行预设置(设置显示模式为0x118),同时获取其显存的地址。(www.xing528.com)
(2)通过Video对象来封装硬件,隔离硬件和软件。系统中的每个显示设备对应一个Video对象,每个Video对象可实现部分或全部预先定义的绘制功能,但DrawPixel和MouseToScreen这两个函数是必须实现的。
(3)为了弥补不同Video对象的能力差异,引入了通用绘制层来适配。通用绘制层调用Video对象来实现绘制功能,同时向更上层提供一致的绘制接口。
(4)更上层的代码,比如窗口管理代码、通用控件代码、用户应用程序代码等,都是直接或间接调用通用绘制层的功能完成屏幕视频输出的,不会直接接触硬件。当然,如果应用程序希望直接操作硬件,Hello China操作系统也不会阻止。
图11-3是Hello China V1.75版自带的一个小程序CPI统计程序的运行结果。这个程序就是综合运用了通用绘制层功能,实现的一个演示程序。
下面进入另外一个主题:用户输入消息在窗口之间的传递,这也是GUI功能的最核心机制。
图11-3 CPI统计程序的运行结果
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。