第五章 增加对话框
完整有特色的交互式应用程式可能拥有许多不同的窗口对象(如窗口、控件、对话框)。主窗口之外的任何窗口都称为子窗口,每个子窗口都只有一个父窗口,一个父窗口能够有多个子窗口。
这种父子关系形成了各个应用程式的相关父子窗口系统。在这个系统中,主窗口是终极父窗口。
有两种子窗口:一个是单独的子窗口,这种子窗口能控制其自身的显示和定位。消息框和对话框都是单独的子窗口。另一类是非单独的子窗口,这种子窗口在其父窗口的表面显示,而且只能在父窗口的范围之内移动。控件(如消息框中的按钮)就是非单独子窗口。这一章将讲述单独的子窗口。
5.1 增加一个对话框
对话框很象一个弹出式窗口,但他通常在屏幕上停留一段时间且执行一种特定的任务。对话框的表面一般都有很多控件组合来显示静态文本、完成数据输入、列表内容选择、互锁按钮选择能内容并根据用户的选择和输入执行某种任务或在激活另一个对话框。
象弹出窗口相同,对话框是个单独的子窗口。从概念上讲,增加一个对话框和增加一个弹出式窗口别无二样。虽然对话框酷似窗口,但他和窗口还存在着重要差异:
l 对话框类是由TDialog派生的,而不是从TWindow派生的。但是TDialog和TWindow两个都是从TObject派生的。
l 通常,对话框需要用户规定其大小、位置。
l 通常,对话框执行一项较短的任务且返回一个值
例如:CanClose消息框根据用户的选择返回一个1或0的应答。
5.2 增加用户自定义对话框的数据成员和操作函数
为完成用户特定的对话框界面元素时,需要自己在布局上、控件选择上重新定义。Object UNIX Class Library提供了十三个控件类可供选择,这些类都从TControl类派生出来的,而Tcontrol类又是从TObject基类派生的。用户能够参考后面的周详类参考选择自己实际需要的控件类设计自己的对话框对象。下面是个对话框对象的范例,您能够模仿该例子构造自己的对话框对象:
class TUserDialog : public TDialog {
public:
TEdit *Edit1;
TComboBox *ComboBox1;
TLabel *Label1;
public:
virtual void InitDialog(void);
virtual int PressEnterEvent(void);
TUserDialog(char *caption,int left,int top,int width,
int height,int ftcolor,int bkcolor);
};
5.2.1 增加对象成员(控件)到对话框中
正如上面例子所定义的描述,用户在对话框中定义了三个对象属性:输入条Edit1、标签(静态文本)Label1连同下拉列表框ComboBox1。这三个对象各从TEdit类、TLabel类、TComboBox类派生。一般为对对话框的按钮进行分类,对话框还增加了线属性连同按钮属性。
在定义好数据成员后,您应该在对话框类的成员虚拟函数InitDialog中对您所定义的对象属性进行实例化,以确定各个对象的实际位置连同所表现的属性如颜色、状态、标题等内容。每个控件都有其属性,比如,您能够配置某个对话框的键盘响应属性。假设您不允许用户在输入条上输入字符,您能够这样配置:Edit1->KeyEvent=FALSE,其他的属性请参考后面类参考。
假如您想修改某个控件,您能够在配置完他的属性后重新显示他。比如您想修改标签的显示文本,您能够这样配置:
Label1->Caption=”其他文本”;
Label1->Show();
假如读者在仔细分析程式是,您能够发现一个函数InsertControl,该函数把用户定义好的控件追加到对话框的控件列表中,这样便于Object UNIX Class Library对每个控件进行定位连同判断各个控件的按键事件。
void TUserDialog::InitDialog(void)
{
Label1= new TLabel("单位全称:",4,1,BLACK_WHITE);
TDialog::InsertControl((TControl *)Label1);
Edit1=new TEdit(50,0,13,1,52,1,BLACK_WHITE,WHITE_WHITE);
TDialog::InsertControl((TControl *)Edit1);
ComboBox1=new TComboBox("帐户种类",13,6,10,4,BLACK_WHITE,
BLACK_CYAN,CYAN_CYAN,WHITE_BLUE,BLUE_BLUE);
ComboBox1->AddString("基本帐户");
ComboBox1->AddString("一般帐户");
ComboBox1->AddString("专用帐户");
ComboBox1->AddString("临时帐户");
TDialog::InsertControl((TControl *)ComboBox1);
TDialog::InsertControl((TControl *)new TLine(M_HORZ,
0,13,70,17,BLACK_WHITE));
TDialog::InsertControl((TControl *)new TButton(SAVE_BUTTON,
"确认",4,14,BLACK_WHITE,WHITE_MAGENTA));
TDialog::InsertControl((TControl *)new TButton(EXIT_BUTTON,
"退出",46,14,BLACK_WHITE,WHITE_MAGENTA));
}
5.2.2 响应对话框事件
一般对话框都为完成某项任务而配置,Object UNIX Class Library提供了您对任何控件按下回车键后的事件响应。比如在输入条输入字符串后,需要根据输入的内容查找数据库,然后显示在对话框的某个静态文本区域,则您需要得到对输入条的按键事件。Object UNIX Class Library基类提供了虚函数PressEnterEvent,用户需要重载该函数,以便针对不同的业务来完成不同的事件响应。
下面是个基本的范例:
int TUserDialog:
ressEnterEvent(void)
{
TButton *Button;
if(strcmp(ControlList->Control->GetClassName(),"BUTTON")==0){
Button=(TButton *)ControlList->Control;
switch(Button->ButtonType) {
case SAVE_BUTTON:
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




