把应用程序定义为类不仅可以继承TApplication类的属性,而且还能为它增加构造主窗口对象的能力。其中,还可以选择初始化实例重定义缺省操作,包括关闭应用程序和处理应用程序的消息。
3.1 应用程序流程
Object Unix/Linux Class Library应用程序的主程序一般将由四个语句构成:
第一个语句通过调用初始化屏幕curses库函数来初始化应用程序屏幕窗口指针,使得所有的后续程序都能引用该窗口指针。
第二个语句通过调用应用程序对象的构造函数来生成应用程序对象。构造函数也初始化应用程序对象的数据成员。
第三个语句调用应用程序的Run成员函数,然后,它调用InitApplication来执行应用程序实例的初始化。接着,调用InitMainWindow来初始化生成主窗口,通过调用Show函数来显示主窗口。在大多数情况下,将只需要定义InitMainWindow成员函数。
之后,成员函数Run通过电泳MessageLoop来启动应用程序的执行,即开始处理传来的应用程序消息并指导应用程序动作的指令。MessageLoop的使命是处理消息循环,它能持续运行直到程序关闭。
第四个语句是关闭屏幕curses窗口,释放窗口指针,退出应用程序。
图3是Object Unix/Linux Class Library控制应用程序流程的函数调用。

图3
3.2 初始化
通过重定义那些初始化应用程序对象的成员函数,可以调整执行过程的各个部分。第一个必须编写的成员函数是InitMainWindow。
所有的Object Unix/Linux Class Library应用程序都必须从TApplication类下派生。
此处是一个最小的应用程序类定义:
class ThelloApp:public Tapplication {
public:
ThelloApp(){};
Virtual void InitMainWindow(void);
};
必须定义一个InitMainWindow成员函数,它负责构造主窗口对象,而且把主窗口对象存放在应用程序对象的数据成员MainWindow之中。此处是一个InitMainWindow成员函数的例子。
void ThelloApp::InitMainWindow(void)
{
MainWindow=new TWindow("",1,0,78,25,WHITE_BLUE,
BLUE_BLUE);
}
这个简单的Object Unix/Linux Class Library应用程序有主程序和一个TApplication的派生所构成。TApplication中定义了成员函数定义了成员函数InitMainWindow。
#include “owl.h”
//定义一个TAPplication的派生类
class ThelloApp:public Tapplication {
public:
ThelloApp(){};
Virtual void InitMainWindow(void);
};
//构造ThelloApp的MainWindow数据成员
void ThelloApp::InitMainWindow(void)
{
MainWindow=new Window("Hello Uuix",1,0,78,25,WHITE_BLUE,
BLUE_BLUE);
}
int main(void)
{
THelloApp HelloApp(”HelloApp”);
HelloApp.Run();
}
上列程序是一个最小的应用程序,它简单地显示一个带标题“Hello Uuix”的窗口。显然,这个程序什么也不能做。
3.3 运行
应用程序的消息循环是在程序调用其应用程序对象成员函数Run(Run调用成员函数MessageLoop)时启动的。在程序执行的整个过程之中,消息循环处理到来的所有用户外界消息。Object Unix/Linux Class Library程序将继承MessageLoop,该函数能自动地工作。成员函数MessageLoop调用主窗口的所有处理消息,在接收到主窗口的退出系统命令后,退出应用程序系统。
3.4 关闭
在应用程序退出之前,程序必须中断消息循环,关闭应用程序的主窗口便能达到关闭应用程序的目的。由于Object Unix/Linux Class Library提供了一种重定义应用程序的关闭行为的机制,例如在关闭之前检查是否有未关闭的文件,在程序关闭之前,可以做一些适当的保护处理。
下面是用户通过使用触发的主菜单退出系统项试图关闭应用程序时可能出现的现象:
(1)应用程序发送一个关闭窗口的消息到主窗口。
(2)主窗口对象通过调用Close成员函数予以响应。Close函数只在检查了应用程序对象(通过调用它的CanClose成员函数)之后,通过调用Close成员函数来关闭主窗口(因为关闭主窗口等于关闭应用程序)。
(3)应用程序对象的CanClose成员函数返回对主窗口的CanClose成员函数的调用结果,故使主窗口自身能够确定是否应该关闭。
总之,应用程序对象负责确认应用程序的关闭与否;缺省情况下,它在确认之前检查主窗口,当然也可以重新定义主窗口类的CanClose成员函数,以便产生一些其他的关闭行为。如果不想改变缺省行为,也可免去重定义应用程序的成员函数CanClose。
3.5 界面对象
(1)界面对象介绍
表示窗口、对话框、和控件的对象称为用户界面对象,或简称为界面对象。TObject是一个基类,它对所有的窗口界面类TDialog、TWindow及其派生类:TControl,都是通用的。TObject定义了窗口、对话框和控件对象的共同行为。TObject的成员函数定义如下:
1)维护Object对象和窗口元素结构的双重性,包括构造函数和控件对象的父指针对象。
2)维护所有从基类派生的事件响应。
3)自动支持派生类的显示。
TObject是在幕后工作的。实际上很少从TObject直接导出新的类。在从TWindow和TDialog派生新类时,对象可以继承许多TObject定义的功能。具有相关界面元素的界面对象的结构能根据情形正确地处理窗口、对话框和控件。例如,为了生成一个完全的界面对象,必须要调用两个成员函数。第一个是构造函数,它构造界面对象和设置对象的属性,如类型和菜单。
第二个成员函数是InitMainWindow和InitDialog,它把界面对象同新的界面元素联系到一起。InitMainWindow成员函数构造主窗口的特定的界面元素,而InitDialog则构造特定的对话框对象,组成包含用户自己需要的控件列表。通过调用各自不同对象的成员函数Show把界面元素在用户屏幕上显示出来。InitMainWindow和InitDialog能够保证正确地构造界面对象的同时保证对象有足够的内存。
类似地,在删除界面对象时,系统自动释放对象的内存。但是,这只是在调用Delete函数时,才删除界面对象,否则,界面对象一直在系统内存中保留着,直到退出应用程序系统,这样能够保证系统能在最短的时间内显示用户的屏幕对象。
应该注意到,生成界面对象和生成对应的直观界面元素并不一定意味着在屏幕上能看到什么东西。当建立直观元素时,Object Unix/Linux Class Library将要检查控件的类型EnableFlag是否置为TRUE。EnableFlag和其他的窗口控件类型是在构造函数中对数据成员进行设置的。仅当各个属性成员数据都设置为TRUE时,界面元素才在生成后通过对象的成员函数Show显示出来。任何时候,通过调用界面对象的成员函数Show可以显示或隐藏界面元素。
|