LfrApp.Run();
FreeScreen();//释放分配的curses库空间
}
在第二个语句中,main构造了范例程式的“应用程式对象”。字符串“Sample Object UNIX Class Program”给传递给构造函数,进而被赋值给数据成员AppName。他们最终是作为应用程式对象的数据成员存放。然后调用TlfrApp.Run来启动Object UNIX Class Library应用程式的执行。
l 定义应用程式类
应用程式必须从标准的Object UNIX Class Library类Tapplication(或Tapplication派生的某个类)派生出新的类。这个新类至少应该重定义一个虚拟成员函数InitMainWindow。InitMainWindow在Object UNIX Class Library应用程式初始化期间构造一个主窗口对象。此处是类Tapplication的定义:
class TLfrApplication : public TApplication {
public:
TlfrApplication(char *AppName)();
Virtual void InitMainWindows(void);
};
这个主窗口对象存放在应用程式对象的MainWindow数据成员之中。应用程式对象拥有主窗口对象,但两者在层次上并不相关。这种拥属关系被称为事件链(instance linkage)。TlfrApp::InitMainWindow的定义如下所列:
void TlfrApp::InitMainWindow(void)
{
MainWindow=new TWindow("Sample Object UNIX Class Program",
1,0,78,25,WHITE_BLUE,BLUE_BLUE);
}
TlfrApp的主窗口对象是作为TWindow的一个事例而构造的(如上所似)。其中第一个参数是窗口的标题,他是应用程式主窗口对象的Caption的数据成员,已被置为“Sample Object UNIX Class Program”。这样,主窗口对象将作为Object UNIX Class Library的派生类的一个事例。
下面给出第一个范例程式的完整列表:
#include “owl.hpp”
class TLfrApplication : public TApplication {
public:
TlfrApplication(char *AppName)();
Virtual void InitMainWindows(void);
};
int main(void)
{
InitScreen();//初始化curses库
TlfrApp LfrApp(“Sample Object UNIX Class Program”);
LfrApp.Run();
FreeScreen();//释放分配的curses库空间
Return 0;
}
2.4 第二步:主窗口类
第一个程式有两个对象组成:应用程式对象和窗口对象。应用程式对象LfrApp是TlfrApp类的一个实例,他是从类Tapplication派生而来的。保存在MainWindows之中的窗口对象指针指向TWindows的一个实例,这是个一般性的Object UNIX Class Library窗口。能够按正常方式为主窗口定义自己的窗口类。包括组合进去应用程式特有的操作,此处,通过定义一个特别的窗口类(从Twindow类派生的)而使主窗口产生活力。
2.4.1 何谓主窗口
在第一个步骤中,读者能够看到应用程式对象封装了基于UNIX文本环境下curses库的交互式应用程式的标准操作,包括构造主窗口。类Tapplication为Object UNIX Class Library的应用程式提供了基本的操作。类似地,窗口对象也封装了窗口的必要操作,包括:
l 窗口自身的显示
l 支持菜单操作
l 事件响应
Object UNIX Class Library窗口类提供了这些操作。
为使程式有趣且有用,必须依据Object UNIX Class Library类生成新的窗口类。新的类不但能够继承父类的成员函数和数据成员,而且还能增添其自己的成员函数和数据成员。总之,面向对象方法避免了从头构造窗口的必要性。
2.4.2 生成主窗口对象
既然已有了主窗口对象构成的概念,边能够定义新的主窗口。新的窗口类是有Twindow派生的,将用于构造应用程式的主窗口。首先,说明新类的TlfrWindow:
class TlfrWindow:public Twindow {
public:
TLfrWindow(char *caption,int left,int top,int width,
int height,int ftcolor,int bkcolor) :
TWindow(caption,left,top,width,height,ftcolor,bkcolor){}
};
注意,新的派生类的构造函数不定义新的行为,而只是调用基类(TWindow)的构造函数。
其次,更改TlfrApp::InitMainWindow使其构造一个TlfrWindow对象,而不是Twindow对象。
Void TlfrApp::InitMainWindow(void)
{
MainWindow = new TlfrWindow("Sample Object UNIX Class
Program",1,0,78,25,WHITE_BLUE,BLUE_BLUE);
}
说明新类和在InitMainWindow成员函数中对其作初始化是为主窗口的新类需要,应用程式对象调用窗口对象的成员函数生成窗口界面元素并将探们显示在屏幕上。
然而,TLfrWindow除了从TWindow和TObject继承属性之外,并没有定义新的饿属性。换句话说,并没有给应用程式增添新的内容。下一节,将增加某些新的属性。
2.4.3 响应事件
使一个窗口对象生效的最快捷的方法是教他如何响应消息。由于在UNIX环境下的curses很少采用鼠标操作,所以本系统采用对键盘操作事件的捕获来响应用户的击键事件。
在主窗口中,最常用的是对主窗口菜单事件的处理。为了解释和响应菜单选择事件,必须在主窗口类中为每个菜单项定义一个类成员函数,这些成员函数统称为消息响应函数。当用户在选择某个菜单项的时候,通过对消息响应函数的内部判别来执行用户的按键选择事件。
此处的周详说明,请参阅下一章的增加菜单。
2.4.4 终止应用程式
当用户选择主窗口的退出系统菜单项时,程式便被关闭。这包括关闭窗口显示和终止程式执行。这种关闭操作似乎没有什么问题,但对于其他情形,恐怕则不然。
例如,在退出应用程式时是否保存自己的工作?一个好的应用程式在用户工作未被保存时,总要询问用户是否要包寻结果。能够很容易地增加这种属性到Object UNIX Class Library应用程式中。能够在示范程式中增加双重检查用户退出请求的功能。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




