GUI将某些消息直接发送给应用程序的窗口函数,而不是将它们放入到应用程序队列中,这样的消息称为非排队消息。通常,非排队消息是那些仅影响该窗口的消息。虽然大多数消息都由GUI产生,但应用程序也可以产生自己的消息并将其加入到应用程序队列中。
一旦应用程序的主函数从队列中获取了消息,就可以将消息传送给相关窗口的窗口函数,并把消息的内容作为参数传递过去,这样,窗口函数就可以处理这个消息,完成相应的工作。当窗口函数返回后,GUI将控制权返回给主函数。主函数可以再从队列中取出下一消息进行处理。
2.4 窗口管理
窗口是终端应用程序的主要输入输出设备。应用程序只有通过窗口才能访问显示设备。窗口由标题条、菜单条、滚动条、边框以及在显示设备上的矩形框里出现的其它特性组成。当创建窗口时,可为窗口指定所要求的特性,然后GUI画出此窗口并管理它。
虽然应用程序创建了某一窗口,并且从技术上来说可以独占它,但该窗口的管理实际上是由应用程序与GUI相互协作来实现的。GUI管理窗口的位置和显示方式,并管理窗口的标准特性,如边框、标题等,同时完成许多由用户初始化并直接影响窗口的任务。而应用程序则管理窗口的其它所有工作,特别是负责管理窗口的“客户区”(窗口边框以内的区域)。应用程序可完全控制属于自己的窗口客户区的显示。
为管理这一协作任务,GUI告知每个窗口其变化可能要受到影响。因此,每个窗口必须具有相应的“窗口函数”,用于接收窗口管理消息。窗口管理消息既可指定该函数要执行的动作,也可请求该窗口函数返回信息。
窗口函数作为窗口最重要的基本属性,处理所有传送到本窗口的消息。窗口的表现及行为特征是由窗口函数定义的对消息的处理所决定的。在正常情况下,具体的窗口函数只处理部分指定的消息,而正是这部分特定消息的处理决定了各个窗口的不同特性。通过调用窗口函数,将消息参数传递到所指定的窗口函数,由窗口函数依据消息所携带的消息参数进行判断处理。对绝大部分消息只需将其送往缺省窗口函数进行处理。缺省窗口函数集成了标准窗口函数对消息的标准处理,是对所有窗口函数的一个共性集合窗口管理收集所有的输入信息,然后把这些输入信息以消息的形式送往合适的窗口。这些消息的执行结果又可能产生新的消息,新消息的传送仍由窗口管理负责。窗口管理通过调用窗口函数,向窗口函数传递消息参数,把消息送到目的窗口。在移动终端中,采用消息分派技术将协议栈消息依次发往所有具有系统属性的窗口。通过窗口树表将非协议栈消息送往所获取的当前焦点窗口。
3. GUI调用流程
下面通过一个具体例子分析GUI函数调用流程:移动终端的窗口系统初始化时首先要创建一个菜单,在注册菜单窗口类时将菜单序号图片全部按顺序读入内存,这就需要GDI用画刷对象来进行矩形填充,下图清晰的显示了GUI在注册这个窗口类时各层调用的流程。
图4. GUI调用流程
4. 结语
GUI系统是一项复杂的软件工程,本文设计和实现的GUI占用资源少、可配置,特别适用于移动终端。它给终端上层应用提供了一个清晰的图形界面。同时,在将它用于多种终端平台时还要尽可能考虑它的可扩展性、兼容性、可移植性等属性。