模态窗口
窗口分为模态窗口和非模态窗口。
模态窗口的特性我们经常用到的MsgBox()和MsgBoxEx()函数所弹出的对话框就类似于模态窗口。为:当一个模态窗口显示在最前端时,如果用户想要对该窗口以外的程序部分进行操作时,必须首先对该窗口进行响应。如单击【确定】或【取消】按钮或者直接关闭该画面。
非模态对话框的特性为:当一个非模态窗口显示在最前端时,它并不限制用户的操作对象。如果同时打开多个非模态窗口,那么用户可随意操作这些窗口中的任意窗口,而不必事先关闭前端窗口。
有些情况下我们必须使用模态窗口才能解决一些问题。例如,我们在制作一些设置画面时,我们希望使用者在打开该画面时不能对其他画面进行操作,只有关闭该画面后才允许进行其他操作。此种情况只能用模态窗口来解决了。
模态窗口的使用
模态窗口的打开与关闭是通过两个函数来实现的:
#窗口名.DoModal();//以模态方式打开窗口
#窗口名.EndModal(int Expr);//结束模态窗口
例如:在非模态窗口window中的一处脚本中执行#ModalWindow.DoModal()语句,则窗口ModalWindow会以模态方式打开,此时窗口window在窗口ModalWindow调用EndModal(int Expr)函数或被关闭之前会一直处于暂停状态,不响应用户的任何操作。用户仅能在模态窗口ModalWindow上进行操作,操作完成后可以使用#ModalWindow.EndModal(int Expr)语句来结束当前模态窗口(该窗口将会隐藏,但并不关闭),其中参数Expr(由用户控制,不限制其取值范围)将传递给DoModal()函数作为其返回值,接续执行下面的脚本。用户可以根据这个Domodal的返回值来确定模态窗口的操作结果。
下图为模态窗口使用示意图:
应用进阶
通常情况下,我们可以使用模态窗口的EndModal(int Expr)函数中的参数Expr来指定该窗口结束时的返回值。正如上图所示,我们可以通过Expr得知用户点击的是【下一步】、【确定】亦或是【取消】按钮。但有些时候,仅仅得到这些信息是不够的。例如,我们需要得知在点击【下一步】或者“确定”按钮后用户具体选择了窗口ModalWindow中的哪些选项。
这时,我们需要使用其他方式在窗口间传递更多的信息。可以选择的方式有很多,比如使用全局变量、使用全局自定义函数或者使用窗口元素的外部引用功能等。但是,使用全局变量或全局自定义函数将增加工程的耦合型,降低工程的可移植性。较为妥当的方式是使用窗口元素的外部引用功能,即窗口间通讯。
我们可以在打开模态窗口前就进行相应的信息传递,利用窗口变量作为传递和保存信息的载体。前面说过,当一个模态窗口结束时并不意味着该窗口被关闭,其实它只是被隐藏在后台,这时我们仍然可以访问该模态窗口中的元素。也就是说,在模态窗口结束时,它可以主动向当前窗口反馈相关的信息,或者当前窗口直接读取刚结束的模态窗口相关信息。
注:有关窗口元素的外部引用功能,读者可以参考联机帮助中的相关说明。