SCO UNIX环境下面向对象的程序设计 4

发表于:2007-06-08来源:作者:点击数: 标签:
第四章增加菜单 大多数交互式 UNIX 应用程序的主窗口内都有菜单,它可为用户提供各种选择,如File|Save、File|Open、以及Help。本章将增加一个标准的菜单到范例程序中。 在交互式应用程序环境中,菜单选择属于用户事件。响应菜单选择与响应其它用户事件具有

第四章 增加菜单
大多数交互式UNIX应用程序的主窗口内都有菜单,它可为用户提供各种选择,如File|Save、File|Open、以及Help。本章将增加一个标准的菜单到范例程序中。

在交互式应用程序环境中,菜单选择属于用户事件。响应菜单选择与响应其它用户事件具有很大的相似性,本章将按以下步骤为范例程序增加菜单:

l     定义菜单

l     加载菜单项到主窗口对象中

l     定义对菜单选择的响应

l     设置菜单的有效性及无效性

4.1 主窗口菜单
应用程序菜单不是单独的对象,而是归属于主窗口。事实上,它作为主窗口的一个属性对象,被存放在包含窗口生成属性的窗口对象数据成员MainMenu字段中,在应用程序初始化主窗口中通过调用主窗口类的成员函数InsertMainMenu来增加主菜单以及通过调用主窗口类的成员函数InsertSubMenu来增加某项主菜单的子菜单。

下面我们给出TlfrApplication类的初始化主窗口函数InitMainWindow的源代码。

void TLfrApp::InitMainWindow(void)

{

MainWindow=new TLfrWindow("Object UNIX Class Program",                           1,0,78,25,WHITE_BLUE,BLUE_BLUE);

     TMenu *Main1,*Main2;

     Main1=new TMenu(1,"C文件",'c');

     Main2=new TMenu(2,"V帮助",'v');        

     MainWindow->InsertMainMenu(Main1);

     MainWindow->InsertMainMenu(Main2);

     MainWindow->InsertSubMenu(Main1,new TSubMenu(1,"[A]打开文件",'a',"打开文件",TRUE,(MEMBERFUNCTION)TLfrWindow::OpenFile));

     MainWindow->InsertSubMenu(Main1,new TSubMenu(2,"-",0,"",TRUE));

     MainWindow->InsertSubMenu(Main1,new TSubMenu(3,"[X]退出系统",'x',"返回操作系统",TRUE,(MEMBERFUNCTION)TLfrWindow::Close));

MainWindow->InsertSubMenu(Main2,new TSubMenu(1,"[A]帮助”,

'a',"",TRUE));

}

分析上述程序行可以看出,在实例化主窗口对象后,在程序的第四、五行定义主菜单对象并通过主窗口类的成员函数InsertMainMenu把主菜单对象赋给主窗口主菜单数据成员,作为主窗口的一些菜单对象属性使用。接着通过InsertSubMenu成员函数添加各主菜单项的子菜单项。组成完整的主窗口菜单系统。

主菜单以及子菜单对象的构造函数定义请参阅后面的类说明。

这样,主窗口显示出来时,便把主菜单项同时显示出来。然而,为了赋予菜单选项一定的使命,必须遵循以下步骤来响应菜单选择。

4.2 解释菜单消息
当用户从窗口菜单选项时,窗口能够接收到该命令消息。为了能够处理当选择特定的菜单选项时Object UNIX Class Library系统送来的命令消息,需要定义Object UNIX Class Library命令响应成员函数,对于命令响应成员函数,需要用户在主窗口类中定义特定的成员函数,如下所似:

void OpenFile(void);

该函数和TLfrWindow类中的成员函数一样,需要由用户在定义从TWindow类派生出的派生类TLfrWindow时定义的。

需要说明的是,在InsertSubMenu成员函数的参数中,最后一个参数表示当按下这个菜单项时执行该成员函数。本例在按下打开文件子菜单时执行用户自己定义的成员函数OpenFile。

(MEMBERFUNCTION)TLfrWindow::OpenFile的写发表示该函数的类型为成员函数,其主类为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){}

    void OpenFile(void);//响应菜单项的成员函数

};  

4.3 响应菜单消息
对每个菜单选项,都有一个可供调用的成员函数,包括用户自己定义的成员函数和Object UNIX Class本身继承的基类成员函数如上例按下退出系统子菜单选项执行的Close函数。

例如,对于菜单项文件|打开文件,对应有成员函数OpenFile将被调用。这里只是显示一个消息框。

void TLfrWindow::OpenFile(void)

{

    MsgDialog(“信息窗口”,”打开一个文件”);

}

当然,您可以定义更加复杂的成员函数来完成自己的实际业务,比如,弹出一个业务操作对话框,或者查询数据库等等。Object UNIX Class Library提供给用户的目的是提供简单的应用程序编程框架,完成用户可以不必完成的操作,封装对用户来说比较复杂的屏幕交互式操作,而使得用户只是简单地在框架的基础上完成自己需要完成的业务,这是Object UNIX Class Library系统提供给您的目的,达到进行快速应用程序开发的目的。

原文转自:http://www.ltesting.net