第四章 增加菜单
大多数交互式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系统提供给您的目的,达到进行快速应用程序开发的目的。
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/