[quote:da047b69ee]第七章 模块和应用程序
编制Object UNIX Class Library应用程序所要做的第一件事情是定义一个应用程序类,这个类是从Object UNIX Class Library的TApplication类派生而来的。应用程序将继承Object UNIX Class Library应用程序的下列属性:
l 生成和显示应用程序主窗口
l 初始化一个应用程序实例
l 初始化菜单对象和所有对话框
l 处理事件消息循环
l 关闭应用程序
把应用程序定义为类不仅可以继承TApplication类的属性,而且还能为它增加构造主窗口对象的能力。其中,还可以选择初始化实例重定义缺省操作,包括关闭应用程序和处理应用程序的消息。
7.1 应用程序流程
Object UNIX Class Library应用程序的主程序一般将由四个语句构成:
第一个语句通过调用初始化屏幕curses库函数来初始化应用程序屏幕窗口指针,使得所有的后续程序都能引用该窗口指针。
第二个语句通过调用应用程序对象的构造函数来生成应用程序对象。构造函数也初始化应用程序对象的数据成员。
第三个语句调用应用程序的Run成员函数,然后,它调用InitApplication来执行应用程序实例的初始化。接着,调用InitMainWindow来初始化生成主窗口,通过调用Show函数来显示主窗口。在大多数情况下,将只需要定义InitMainWindow成员函数。
之后,成员函数Run通过电泳MessageLoop来启动应用程序的执行,即开始处理传来的应用程序消息并指导应用程序动作的指令。MessageLoop的使命是处理消息循环,它能持续运行直到程序关闭。
第四个语句是关闭屏幕curses窗口,释放窗口指针,退出应用程序。
下图是Object UNIX Class Library控制应用程序流程的函数调用:
TApplication类
Run
InitMainWindow
InitApplication
MessageLoop
7.2 初始化应用程序
通过重定义那些初始化应用程序对象的成员函数,可以调整执行过程的各个部分。第一个必须编写的成员函数是InitMainWindow。
7.2.1 初始化主窗口
所有的Object UNIX 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 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 UNIX",1,0,78,25,WHITE_BLUE,
BLUE_BLUE);
}
int main(void)
{
THelloApp HelloApp(”HelloApp”);
HelloApp.Run();
}
上列程序是一个最小的应用程序,它简单地显示一个带标题”Hello UNIX”的窗口。显然,这个程序什么也不能做。
7.3 运行应用程序
应用程序的消息循环是在程序调用其应用程序对象成员函数Run(Run调用成员函数MessageLoop)时启动的。在程序执行的整个过程之中,消息循环处理到来的所有用户外界消息。Object UNIX Class Library程序将继承MessageLoop,该函数能自动地工作。
成员函数MessageLoop调用主窗口的所有处理消息,在接收到主窗口的退出系统命令后,退出应用程序系统。
7.4 关闭应用程序
在应用程序退出之前,程序必须中断消息循环,关闭应用程序的主窗口便能达到关闭应用程序的目的。由于Object UNIX Class Library提供了一种重定义应用程序的关闭行为的机制,例如在关闭之前检查是否有未关闭的文件,在程序关闭之前,可以做一些适当的保护处理。
下面是用户通过使用触发的主菜单退出系统项试图关闭应用程序时可能出现的现象:
1、 应用程序发送一个关闭窗口的消息到主窗口。
2、 主窗口对象通过调用Close成员函数予以响应。Close函数只在检查了应用程序对象(通过调用它的CanClose成员函数)之后,通过调用Close成员函数来关闭主窗口(因为关闭主窗口等于关闭应用程序)。
3、 应用程序对象的CanClose成员函数返回对主窗口的CanClose成员函数的调用结果,故使主窗口自身能够确定是否应该关闭。
总之,应用程序对象负责确认应用程序的关闭与否;缺省情况下,它在确认之前检查主窗口,当然也可以重新定义主窗口类的CanClose成员函数,以便产生一些其它的关闭行为。如果不想改变缺省行为,也可免去重定义应用程序的成员函数CanClose。
[/quote:da047b69ee]
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/