[quote:3348e888c8]第十章 对话框对象
对话框是一种界面元素,它的生成属性由用户自己根据业务需要定制的,用户可以设置它的位置、大小、标题以及各种控件的组合。
对话框大凡都用作为子窗口,以执行一项与输入或选择有关的专门任务。例如,可以用一个子对话框来接受构置打印机的参数设置。Object UNIX Class Library提供了三个Dialog类的派生类:TInputDialog、TFileDialog、TPrintFialog。TInputDialog从用户输入接受一个文本行,TFileDialog索取一个文件名,TPrintDialog设置打印参数。
10.1 使用对话框对象
一般对话框在应用程序主窗口生成时,就已经生成了对话框对象,用户可以在需要时随时显示它,只到用户删除该对话框对象。在对话框对象显示时,用户没有必要设置变量去保存被对话框覆盖的主窗口区域,因为Object UNIX Class Library以及替您完成了这些操作。退出显示对话框后,系统自动为您恢复到对话框显示之前的状态。每次在对话框显示时,TDialog基类函数会保存被覆盖的区域屏幕内存数据,而在退出显示时,释放它。
10.2 构造和初始化对话框对象
TDialog的构造函数需要七个参数:对话框标题、相对于主窗口的列行坐标、对话框大小以及前景和背景颜色。
为了接受实际的派生类传递参数,需要重载了它的构造函数:
AboutDialog=new AboutDialog("Sample Dialog",17,6,46,13,
BLACK_CYAN,CYAN_CYAN);
下面以显示版本信息为例,构造一个新的对话框对象:
TAboutDialog::TAboutDialog(char *caption,int left,int top,
int width,int height,int ftcolor,int bkcolor)
:TDialog(caption,left,top,width,height,ftcolor,bkcolor)
{
Caption=caption;
Left=left;
Top=top;
Width=width;
Height=height;
BKColor=bkcolor;
FTColor=ftcolor;
InitDialog();//调用对话框初始化函数,设置界面控件对象
}
void TAbout::InitDialog(void)
{
TDialog::InsertControl((TControl *)new TLabel("Object UNIX
Class(SCO UNIX版)",5,2,FTColor));
TDialog::InsertControl((TControl *)new TLabel("All Rights Reserved",
14,4,FTColor));
TDialog::InsertControl((TControl *)new TLabel("Version
1.0",17,6,FTColor));
TDialog::InsertControl((TControl *)new TLabel("C++类库例子程序",
11,8,FTColor));
TDialog::InsertControl((TControl *)new TLine(M_HORZ,0,10,Width,10,
FTColor));
TDialog::InsertControl((TControl *)new TButton(EXIT_BUTTON,"退出",
19,11,BLACK_CYAN,WHITE_MAGENTA));
}
10.3 生成和执行对话框
当TDialog被执行或生成时,将要建立子对话框对象和界面元素的联系。对话框的执行依赖于用户的输入;当取得输入和关闭对话框之时,执行过程方告停止。例如,当关闭一个文本编辑窗口时,将要执行一个对话框来确定是否保存编辑内容。
事实上,在对话框执行期间,其父窗口是不起作用的。它不能响应用户输入。另外,Object UNIX Class Library提供的对话狂对象自动支持数据传输机制,也就是说,当用户在对话框上进行某些操作如输入和选择后退出显示对话框时,当用户再次启动对话框时,原来的数据还保留着。
如果用户不想保留数据传输机制,需要每次都是显示初始化状态的对话框时,需要用户重载对话框类成员函数ExecDialog。
10.4 关闭对话框
通过调用对话框的Close成员函数可以关闭对话框。Object UNIX Class Library定义,所有关闭对话框的行为只能通过按下按钮控件操作来进行,并且定义,只有OK_BUTTON和EXIT_BUTTON这两类才能关闭对话框,所以,用户在设计对话框时,一定要有一个按钮控件,并且按钮控件的标识有一个必须为OK_BUTTON或EXIT_BUTTON。
10.5 控件管理和事件消息处理
控件是由父对话框来建立和管理的,但它提供较少的管理。所以,对于控件间的控制与管理,需要用户根据需要自己管理。Object UNIX Class提供了必要的接口。
对话框对象和它的控件元素之间能够进行双向通信。一方面,对话框需要管理和查询它的控制,例如,对话框可能要填充一个列表或者从一个编辑控件中索取文本;另一方面,当对话框可能需要知道的事件时,对话框控件需要通知对话框。例如,当按钮控件被触发时,它要通知它的父对话框。
通过把控件同其它控件对象相关联,可以简化对话框对象和其控件之间的通信,因此,您需要为每个有键盘事件的控件或者需要知道它属性值的控件定义一个类数据控件成员,这样,您就可以直接引用该控件并取得该控件的全部信息。
为了响应对话框以及控件事件,需要重载类成员虚函数PressEnterEvent。该函数提供用户处理控件按键时间的接口。详细的控件时间响应请参阅前几章的说明。
10.5.1 定义消息响应函数
您可以在自己派生的对话框中定义相对应的事件响应函数,以对应当某控件按下回车键时产生事件而去执行该时间响应函数。系统将自动地在当某控件得到焦点时,如果按下回车时,自动执行您已经预先定义的函数。
在派生对话框类定义中可以定义如下:
…
void PressExitButtonEvent(void);
…
在对话框成员函数定义中,可以如下定义:
void TAboutDialog:ressExitButtonEvent(void)
{
…
}
10.5.2 执行消息响应函数
为使消息响应函数赋予某指定控件,需要把定义好的消息响应函数传递给指定的控件。您可以在控件实例化时,传递该消息响应函数。
下面以按钮控件为例:
void TAboutDialog::InitDialog(void)
{
…
TDialog::InsertControl((TControl *)new TButton(EXIT_BUTTON,"退出",
19,11,BLACK_CYAN,WHITE_MAGENTA,
(KEYEVENTFUNCTION)PressExitButtonEvent));
…}
上例表示在对话框初始化时,把PressExitButtonEvent消息响应函数赋给退出按钮控件,这样,当您按下退出按钮时,将自动执行PressExitButtonEvent函数。
[/quote:3348e888c8]
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/