| WideStudio Programming Guide | WideStudio Index Table of contents

> ## The sample of the event procedures for WSCvlabel

> ### Making the WSCvlabel instance click-able

> In the sample of the event procedures, It is a most basic procedure that makes the label instance to react to the mouse pointer. Here, you will create a procedure to make it counting up clicking of the mouse pointer.

>     #include "WSDmouse.h"
>     //Set this to a label instance with WSEV_MOUSE_PRESS
>     //                                  (MOUSE-PRESS trigger)
>     void cbop(WSCbase* object){

>       //(0) Which the mouse button is pressed?
>       // btn1 -> fire. btn2 or the other -> return.
>       if ( (WSGIappMouse()->getMouseStatus() & WS_MOUSE_BTN1) == 0){
>         return;
>       }

>       //(A)Get the value of the property: WSNuserValue
>       long value = object->getProperty(WSNuserValue);
>       //(B)Count it up.
>       value++;
>       //(C)Display the value.
>       object->setProperty(WSNlabelString,value);
>       //(D)Store the counted value into the property:
>       //                          WSNuserValue for the next time.
>       object->setProperty(WSNuserValue,value);
>     }

> At first, this event procedure uses the property: WSNlabelString to display the number which is counted up. So, The kind of class like WSCvbtn,WSCvlabel which has it, can be used with WSEV_MOUSE_PRESS trigger. It will be executed by clicking of the mouse pointer.
> - (0): It distinguishes whether the mouse btn 1 is pressed. Please refer to it for your implementation.
> - (A): It uses the property: WSNuserValue to contain the value of the counter. The default value of the property is 0, and it can be used freely by user. The procedure uses it because it wants to store each counter value of each label instance. the counter value becomes a singleton when the procedure uses the static variable for the counter, even if used by many label instances.
> - (B): It increases the counter.
> - (C): It stores into the property: WSNlabelString to display it.
> - (D): It stores into the property: WSNuserValue for the next time.
> If by WSEV_MOUSE_IN trigger is used, it count the number of entering and exiting of the mouse pointer.

> ### Making the WSCvlabel instance select-able

> Here, you will create a procedure to make the label instance select-able by clicking of the mouse pointer. To display the instance is selected, the procedure changes the back-color of it. This time, the procedure uses the method: set/getUserData() to get/store data instead of the property: WSNuserValue.

>     //Set this to a label instance with WSEV_MOUSE_PRESS
>     //                                  (MOUSE-PRESS trigger)
>     void cbop(WSCbase* object){
>       //(A) Get the value with getUserData()
>       long value =  (long)object->getUserData("STATUS");
>       //(B) it makes the instance selected  if value is 0,
>       //                              and unselected if 1.
>       if (value == 0){
>         //(C) Store the backcolor(which is string type) into WSNuserString
>         WSCvariant color = object->getProperty(WSNbackColor);
>         object->setProperty(WSNuserString,color);
>         //(D)Set the backcolor to the selected color.
>         object->setProperty(WSNbackColor,"slategray4");
>         //(E)Store the state with setUserData().
>         value = 1;
>         object->setUserData("STATUS",(void*)value);
>       }else{
>         //(F)Get the original backcolor from WSNuserString.
>         WSCvariant color =  object->getProperty(WSNuserString);
>         //(G)Store it to WSNbackColor to display with the original color.
>         object->setProperty(WSNbackColor,color);
>         //(H)Store the state with setUserData().
>         value = 0;
>         object->setUserData("STATUS",(void*)value);
>       }
>     }

> The kind of class like WSCvbtn,WSCvlabel which has the property: WSNbackColor, can be used with WSEV_MOUSE_PRESS trigger. It will be executed by clicking of the mouse pointer.
> - (A): It uses the method: set/getUserData() to contain the selected value of the state. The default value of the method is 0, and it can be used freely by user. The procedure uses it because it wants to store each status of each instance.
>   You can specify a name of value to store with setUserData(), and can get the value by the specified name with getUserData().
> - (B): It distinguishes the state.
> - (C): It stores the original back-color to the property: WSNuserString.
> - (D): It makes the instance selected.
> - (E): It stores the state with setUserData() again.
> - (F): It gets the original back-color from WSNuserString.
> - (G): It stores the original back-color to WSNbackColor.
> - (H): It stores the state with setUserData() again.

> ### Making the WSCvlabel instance highlight-able

> Here, you will create a procedure with WSEV_MOUSE_IN/OUT to make the instance highlighted. Coming into the area,the instance is highlighted,and Going out of the area, it is returned normal.
> An important matter is that you create a procedure which prepares a sub-procedure with WSEV_MOUSE_IN and another with WSEV_MOUSE_OUT. In other words,that procedure with WSEV_INITIALIZE is executed, it adds two sub-procedures to the instance which trigger is WSEV_MOUSE_IN and WSEV_MOUSE_OUT to make the instance highlight-able. One procedure can prepares many procedures. Then you can go with a procedure even if many procedures are needed.

>     //a sub-procedure with WSEV_MOUSE_IN trigger
>     void subop1(WSCbase* object){
>         //(A)Store the original back-color to WSNuserString
>         WSCvariant color = object->getProperty(WSNbackColor);
>         object->setProperty(WSNuserString,color);
>         //(B)highlight the instance.
>         object->setProperty(WSNbackColor,"slategray4");
>     }
>     //a sub-procedure with WSEV_MOUSE_OUT trigger
>     void subop1(WSCbase* object){
>         //(C)Get the original back-color from WSNuserString
>          WSCvariant color = object->getProperty(WSNuserString);
>         //(D)Store the original back color.
>         object->setProperty(WSNbackColor,color);
>     }
>     //a main-procedure with WSEV_INITIALIZE trigger
>     void cbop(WSCbase* object){
>        //If executed,it add the sub-procedures to the instance.
>        //(E) Setup a sub-procedure:WSEV_MOUSE_IN.
>        //ProcedureName="Highlight1" Trigger=WSEV_MOUSE_IN Function=subop1
>        WSCprocedure* ac1 = new WSCprocedure("Highlight1",WSEV_MOUSE_IN);
>        ac1->setFunction(subop1,"subop1");
>        object->addProcedure(ac1);
>        //(F) Setup a sub-procedure:WSEV_MOUSE_OUT.
>        //ProcedureName="Highlight2" Trigger=WSEV_MOUSE_OUT Function=subop2
>        WSCprocedure* ac2 = new WSCprocedure("Highlight2",WSEV_MOUSE_OUT);
>        ac2->setFunction(subop2,"subop2");
>        object->addProcedure(ac2);
>     }

> The subop1() is executed by WSEV_MOUSE_IN fired, and makes the instance back-color highlight(A)(B). The subop2() is executed by WSEV_MOUSE_OUT fired, and makes the instance back-color original one(C)(D). The main procedure is executed by WSEV_INITIALIZE only once to setup the sub-procedures (E)(F).

> ### Making a group of selectable WSCvlabel instances

> Here, you create a event procedure to make a group of the mouse-selectable label instances on the same parent. the procedure make the instance selected by storing WS_SHADOW_IN to the property:WSNshadowType and memorize which instance is selected by storing it to its parent instance.

>     //An event procedure with WSEV_MOUSE_PRESS trigger
>     void cbop(WSCbase* object){
>       //(A)Use the value of WSNuserValue as "instance identifier"
>       long val = object->getProperty(WSNuserValue);
>       //(B)Make the instance selected: WS_SHADOW_IN state.
>       object->setProperty(WSNshadowType,WS_SHADOW_IN);
>       //(C)Get the last selected instance which is memorized
>            with setUserData() of the parent instance.
>       WSCbase* parent = object->getParent();
>       WSCbase* target = (WSCbase*)parent->getUserData("SelectedItem");
>       //(D)Make it not selected: WS_SHADOW_OUT state.
>       if (target != NULL){
>         target->setProperty(WSNshadowType,WS_SHADOW_OUT);
>       }

>       if (target == object){
>         //(E)When clicking the selected instance twice,
>         //   clear the selected state.
>         parent->setUserData("GroupValue",(void*)0);
>         parent->setUserData("SelectedItem",(void*)0);
>       }else{
>         //(E)The other,store the selected instance to the parent instance.
>         parent->setUserData("GroupValue",(void*)val);      //Instance identifier
>         parent->setUserData("SelectedItem",(void*)object); //selected instance
>       }
>     }

> The label instances needs each instance identifier to recognize which instance is selected, then we decide to use the property: WSNuserValue as the instance identifier which has unique value.
> - (A): Gets the instance identifier from the property: WSNuserValue.
> - (B): Makes the instance selected with WS_SHADOW_IN.
> - (C): Gets the last instance which is selected from the parent instance.
> - (D): Makes the last one not selected.
> - (E): Makes the instance not selected if it is selected twice and clears the value which is memorized in the parent instance.
> - (F): Stores the new selected instance to the parent instance.

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