第九章 窗口对象
本章讲述窗口生成显示以及窗口菜单的设计。Object UNIX Class Library的TWindow类定义了程序主窗口的大多数基本行为。这些行为包括:打开、关闭、显示以及窗口菜单的事件处理。
9.1 TWindow类
Object UNIX Class Library应用程序至少应该有一个主窗口。在应用程序启动之时,主窗口被显示出来。Object UNIX Class Library程序的主窗口通常是一个TWindow派生类的事例。实际上,在本系统的定义中TWindow类就是作为主窗口类使用的,当然,您可以做为其它子窗口使用,但是,对于子窗口,我们一般采用对话框方式来替代子窗口。
9.2 初始化和生成窗口对象
如同对话框和控件对象,窗口对象也是与直观界面元素相管理的界面对象。更确切地说,窗口对象表示窗口元素,是通过存储在主应用程序数据成员MainWindow来标识的。窗口的生成包括两个阶段,构造对象和声车工内直观元素。
9.2.1 初始化窗口对象
在基于UNIX文本环境下的交互式Object UNIX Class Library应用程序中,有个典型的程序窗口:覆盖式、带标题、主菜单、信息行等等。通常这些类型属性以及其它的生成属性都是在窗口对象生成之时设置的,而在直观元素生成之时才使用它们。
窗口对象的生成属性,诸如类型、菜单、位置、标题都是放在它的类成员数据之中。
下表是窗口TWindow类数据成员类型的说明:
数据成员
用途
FTColor
Int类型,窗口前景颜色
BKColor
Int类型,窗口背景颜色
MainMenuNum
Int类型,主菜单项数
MainMenuIndex
Int类型,当前主菜单索引
MainMenu
Tmenu类型,指向主菜单对象的指针
SubMenu
TsubMenu类型,指向子菜单对象的指针
MainHead
Tmenu类型,指向主菜单对象列表的头指针
SubHead
TsubMenu类型,指向子菜单对象列表的头指针
BackGroundBuffer
Chtype类型,指向窗口覆盖的屏幕内存区域的指针
ExitFlag
Int类型,退出主窗口标志
FirstShowAboutWindowFlag
Int类型,显示主窗口版本标志
当从TWindow建立新的窗口类时,至少必须定义一个构造函数,它要调用其基类的构造函数:
class TMyWindow : public TWindow {
…
TMyWindow(char *Caption,int Left,int Top,int Width,int Height,
Int FTColor,int BKColor);
…
};
在基类的构造函数中,通过派生类构造函数传递的参数对基类的数据成员进行赋值,设置其窗口属性数据。
下面是TWindow窗口基类的构造函数:
TWindow::TWindow(char *caption,int left,int top,int width,int height,int ftcolor,int bkcolor)
{
Caption=caption;
Left=left;
Top=top;
Width=width;
Height=height;
BKColor=bkcolor;
FTColor=ftcolor;
MainMenu=NULL;//设置主菜单指针为空
MainHead=NULL; //设置主菜单头指针为空
ExitFlag=0;
FirstShowAboutWindowFlag=0;
}
9.2.2 生成窗口元素
在定义好用户自己的主窗口类之后,主窗口对象的生成在应用程序类实例化之后由其成员函数InitMainWindow对主窗口类进行事例化,并增加主窗口的菜单系统,由于该函数需要用户自己重定义,这就意味着,用户的菜单系统以及窗口属性数据的传递都由用户自己设置,这就保证用户通过Object UNIX Class Library应用程序框架接口,定义自己特定的主窗口。
9.3 主窗口菜单系统
在交互式应用程序中,菜单对象是不可缺少的界面元素,下面将讲述菜单对象的定义和生成。
在Object UNIX Class Library的定义中,主菜单对象和子菜单对象分别是两种不同的类结构,虽然其在功能和样式上有其相似性,子菜单作为主菜单的附属对象也就是子对象在界面元素中存在。当激活主菜单对象时,程序显示子菜单列表供用户选择。
由于子菜单作为主菜单的附属对象存在,所以在定义子菜单项时,需要指定对应的主菜单对象。
9.3.1 菜单结构说明
l 主菜单对象
每个主菜单都有其唯一的标识ID,对用户来说,需要指定的是其唯一标识ID、菜单项说明以及热键定义。对于其它的类数据成员,作为系统内部的参数使用,控制菜单的定位以及显示。
在Object UNIX Class Library系统中,主菜单系统采用双向列表来保存主菜单项对象。
class TMenu {
public:
int ID;//唯一标识
int Left,Top;//相对于窗口的位置
int SubLeft,SubTop,SubWidth,SubHeight;//子菜单项位置
int AllSubItemNum;//子菜单项个数
char *Caption;//菜单项标题
int Key;//热键
TSubMenu *SubMenu;//子菜单对象指针
TMenu *Next;//下一个主菜单对象
TMenu *Prev;//上一个主菜单对象
public:
TMenu(int id,char *name,int key)//构造函数
{
Caption=name;
Key=key;
ID=id;
}
};
l 子菜单对象
相对于主菜单来说,每个子菜单也都有其唯一标识ID,对于主菜单来说,主菜单的事件是激活子菜单,而对于子菜单项来说,其事件是激活某个任务,所以在其数据成员中有两种函数指针:FUNCTION和MEMBERFUNCTION,表示普通函数和类成员函数,
对用户来说,需要指定子菜单唯一标识ID,菜单项名称、热键、菜单说明、子菜单项活动标志以及事件成员函数。本菜单系统具有菜单项活动标志,该标志用于菜单连锁属性设置,例如,在编辑系统中,如果您还没有打开一个文件编辑窗口,则保存菜单项则不能被激活,也就是该菜单项无效。通过主窗口的成员函数SetMenuItemState可以对它进行属性设置。
class TSubMenu {
public:
int ID;//唯一标识
int Num;//子菜单项个数
char *Caption;//子菜单项说明
int ActiveFlag;//活动标志
int BreakFlag;//分栏符标志
int Key;//热键
char *HelpMsg;//菜单项说明
TSubMenu *Next;//下一个子菜单项
TSubMenu *Prev; //上一个子菜单项
TObject *Object;//基类指针
int ExecFlag;//退出应用程序标志
FUNCTION Function;//普通函数指针
MEMBERFUNCTION MemberFunction;//类成员函数指针
public:
TSubMenu(int id,char *name,int key,char *help,int activeflag,MEMBERFUNCTION memberfunction)//构造函数
{
Caption=name;
ID=id;
Key=key;
HelpMsg=help;
ActiveFlag=activeflag;
BreakFlag=FALSE;
//Object=object;
ExecFlag=1;
//Function=NULL;
MemberFunction=memberfunction;
}
TSubMenu(int id,char *name,int key,char *help,int activeflag,FUNCTION function)//构造函数
{
Caption=name;
ID=id;
Key=key;
HelpMsg=help;
ActiveFlag=activeflag;
BreakFlag=FALSE;
Object=NULL;
ExecFlag=2;
Function=function;
}
TSubMenu(int id,char *name,int key,char *help,int activeflag)
{//构造函数
Caption=name;
ID=id;
Key=key;
HelpMsg=help;
ActiveFlag=activeflag;
BreakFlag=FALSE;
Object=NULL;
ExecFlag=0;
Function=NULL;
}
};
9.3.2 菜单对象定义
在初始化主窗口对象时候,应该对菜单对象进行事例化。
l 主菜单对象的事例化
首先定义一个主菜单项的对象指针TMenu *Main,然后把事例化后的主菜单对象赋值给该指针:Main=new TMenu(1,"C主菜单项",'c'),其中第一个参数1表示第一个主菜单项,从1开始编码,以次类推;第二个参数表示主菜单项名称;第三个参数表示热键。最后通过主窗口类成员函数InsertMainMenu把主菜单对象追加到主窗口的主菜单成员数据中:MainWindow->InsertMainMenu(Main)。
l 子菜单对象的事例化
子菜单对象的实例化需要指定该子菜单属于哪个主菜单对象,并为它指定属于该主菜单对象的唯一的连续的菜单编码ID,从1开始编码,以次类推。并通过主窗口类成员函数InsertSubMenu来对每个主窗口增加其子菜单列表对象:MainWindow->InsertSubMenu(Main1,new TSubMenu(1,"子菜单项",'a',"菜单项说明",TRUE,(MEMBERFUNCTION)TLfrWindow::Close))。其中,第一参数表示主菜单对象;第二个参数子菜单项对象的事例。
9.4 主窗口菜单事件
对于主窗口来说,本系统定义唯一响应菜单对象的事件。当然,如果您想定制所有的主窗口对象您必须重载主窗口事件响应虚函数KeyEvent。
其它的事件定义以及响应方式,请参阅上几章说明。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/