WideStudio/MWT Logo
WideStudio/MWT
Programming Guide
WideStudio/MWT 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.90 for WideStudio/MWT ver 3.90, Jul 2005


    WideStudio/MWT documents index | Table of contents

    Copyright(C) WideStudio/MWT Development Team, 1999-2005 Last modified: Jul 31, 2005