| WideStudio Programming Guide | WideStudio Index Table of contents

> ## 用户对话框

> ### 作成简单的用户对话框

> 接着，我们试着制作利用WSCdialog 的简单用户对话框。并且具有下面的功能。
> - 点击某按钮时，显示对话框。
> - 在对话框上有输入区域，有Radio按钮系列。
> - 对话框结束时，核对输入是否正确。
> - 对话框的输入结果显示在标签上。

> [使用用户对话框的范例]
> 这个范例，作为ws/sampes/share/dialog/newproject.prj 提供。

> ### 用户对话框的自动启动控制

> 以下，我们将在提供的ws/sampes/share/dialog/newproject.prj范例试着做用户对话框的自动启动控制。对话框往往作为输入或显示专用窗被使用。因此，作为通常窗口制作时有难处理情况。譬如，想从多个事项过程调用同样的对话框时。
> 这个情况下，如果作为普通的窗口进行处理的话，对话框的输入是否结束的判断处理就复杂。 然而，如果制作为对话框的话，对话框输入结束后，可以通过popup函数实现同期回归处理，可简单地通过事项过程对对话框的输入进行控制。
> 下图中，显示了当被显示窗返回结果时的普通窗和对话框的差异。

> [使用普通窗和对话框的差异]
> 接着，我们将逐顺序说明简单对话框的处理次序。首先制作对话框。制作WSCdialog Class的一个Instance。然后在对话框上配置各种项目。在范例中，配置了下列项目。
> - WSCvifield* newvifi_003
> - WSCradioGroup* newradi_006

> [简单的用户对话框例子]
> 然后，记述分别对对话框的 OK，NO，CANCEL 按钮被按时所做的处理。 通过对话框 ACITVATE 触发器，连接事项过程。使用该这个事项过程，可以确认对话框输入值是否正确，如果不正确，将显示信息窗显示错误。

>     #include <WScom.h>
>     #include <WSCfunctionList.h>
>     #include <WSCbase.h>
>     //----------------------------------------------------------
>     //Function for the event procedure
>     //----------------------------------------------------------
>     #include <WSCdialog.h>
>     #include <WSCvifield.h>
>     #include <WSCradioGroup.h>
>     #include <WSCmessageDialog.h>
>     extern WSCvifield* newvifi_003;
>     extern WSCradioGroup* newradi_006;

>     void dialogep(WSCbase* object){
>       WSCdialog* dialog = (WSCdialog*)object->cast("WSCdialog");
>       if (dialog == NULL){ //A
>         return;
>       }
>       if (dialog->getStatus() != WS_DIALOG_OK){ //B
>         object->setVisible(False);
>         return;
>       }

>       WSCstring str;
>       str = newvifi_003->getProperty(WSNlabelString);
>       if (!strcmp((char*)str,"")){                         //C
>         WSCmessageDialog* msg = WSGIappMessageDialog();
>         msg->setProperty(WSNdefaultPosition,True);
>         msg->setProperty(WSNwidth,500);
>         msg->setProperty(WSNlabelString,
>                          "Please input some string to the input field.");
>         msg->popup();                       //D
>         return;
>       }
>       long val = newradi_006->getProperty(WSNvalue);
>       if (val == 0){                       //E
>         WSCmessageDialog* msg = WSGIappMessageDialog();
>         msg->setProperty(WSNdefaultPosition,True);
>         msg->setProperty(WSNwidth,500);
>         msg->setProperty(WSNlabelString,
>                          "Please select a item of the radio group.");
>         msg->popup();                       //F
>         return;
>       }
>       object->setVisible(False);            //E
>     }
>     static WSCfunctionRegister  op("dialogep",(void*)dialogep);

> 首先，取得事项过程对话框的Class pointer。通过访问对话框Class固有的getStatus 函数，确认被按按钮的种类。
> A ，不是对话框Class的情况，结束事项过程。 B ，核对被按按钮。OK 按钮以外，不显示对话框。
> C 判断 newvifi_003中的输入。没被输入的情况，用D显示消息对话框，然后结束处理。 E 判断newradi_006是否被选择。没被选择的情况，用F显示消息对话框，然后结束处理。
> 当在E 判断输入正确的情况时，不显示对话框。这时，由于对话框不显示，于是调用对话框的popup函数进行启动。因此，正常显示对话框时，对话框不会自动结束。
> 下面是调出对话框的事项过程例子。

> [调用用户对话框画面的例子]
> 按下显示为[dialog！]的按钮时，对话框将被显示，输入结果将被显示在3个标签上。在第1个的标签上，显示对话框的 OK，NO，CANCEL 按钮被按时的结果，第2个标签上，显示被输入newvifi_003的结果，第3个标签上，显示newradi_006被选择的结果。

>     #include <WScom.h>
>     #include <WSCfunctionList.h>
>     #include <WSCbase.h>
>     //----------------------------------------------------------
>     //Function for the event procedure
>     //----------------------------------------------------------
>     #include <WSCdialog.h>
>     #include <WSCvifield.h>
>     #include <WSCradioGroup.h>
>     #include <WSCvlabel.h>
>     extern WSCdialog* newdial_001;
>     extern WSCvifield* newvifi_003;
>     extern WSCradioGroup* newradi_006;
>     extern WSCvlabel* newvlab_007;
>     extern WSCvlabel* newvlab_010;
>     extern WSCvlabel* newvlab_011;

>     void btnep(WSCbase* object){
>       long val = newdial_001->popup();
>       if (val == WS_DIALOG_OK){
>          newvlab_007->setProperty(WSNlabelString,"DIALOG OK!");
>       }else
>       if (val == WS_DIALOG_NO){
>          newvlab_007->setProperty(WSNlabelString,"DIALOG NO!");
>       }else
>       if (val == WS_DIALOG_CANCEL){
>          newvlab_007->setProperty(WSNlabelString,"DIALOG CANCEL!");
>       }
>       WSCstring tmp;
>       tmp = newvifi_003->getProperty(WSNlabelString);
>       WSCstring tmp2;
>       tmp2 << "INPUT: " << tmp;
>       newvlab_010->setProperty(WSNlabelString,tmp2);

>       val = newradi_006->getProperty(WSNvalue);
>       tmp2 = "SELECT: ";
>       tmp2 << val;
>       newvlab_011->setProperty(WSNlabelString,tmp2);
>     }
>     static WSCfunctionRegister  op("btnep",(void*)btnep);

Document Release 3.70 for WideStudio ver 3.70, May 2004

WideStudio documents index | Table of contents

Copyright(C) WideStudio Development Team, 1999-2004 | Last modified: May 25, 2004