WideStudio Logo
WideStudio
Programming Guide
WideStudio Index
Table of contents


Uma amostra de procedimento de evento para WSCvlabel



Tornando uma instância de WSCvlabel clicável

Na amostra de código de procedimento de evento, o procedimento mais básico cria uma instância de etiqueta (label) para reagir ao ponteiro de mouse. Aqui, poderá ser criado um procedimento para contar o número de cliques do mouse.

#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);
}

Primeiramente, este procedimento de evento utiliza uma propriedade WSNlabelString para apresentar o número de cliques contado. O tipo de classe como WSCvbtn,WSCvlabel que a possui, pode ser usada com o disparador WSEV_MOUSE_PRESS, que será executado ao clique de uma mouse.

Se o disparador WSEV_MOUSE_IN é usado, então conta o número de entradas e saídas do ponteiro de mouse.


Tornando  WSCvlabel uma instância selecionável

Criaremos uma instãncia de etiqueta selecionável por clique de mouse. Para apresentar a instância selecionada, o procedimento altera a cor de fundo da mesma. O procecimento usa o método set/getUserData() para obter e armazenar informação em vez da propriedade 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);
  }
}

  

O tipo de classe tipo WSCvbtn,WSCvlabel que tem a propriedade WSNbackColor, pode ser usada com o disparador WSEV_MOUSE_PRESS. Será executada pelo clique do mouse.




Tornando a instância de WSCvlabel realçável

Faz-se com WSEV_MOUSE_IN/OUT. O mouse entrando na área, torna a área realçada, e ao sair, torna a área ao seu estado normal.

O importante é criar um procedimento que precede um subprocedimento com WSEV_MOUSE_IN e outro WSEV_MOUSE_OUT
Quando o procedimento WSEV_INITIALIZE é executado, ele adiciona dois subprocedimento à instância que dispara WSEV_MOUSE_IN e WSEV_MOUSE_OUT para tornar a instância realçável. Um procedimento pode preceder muitos outros.

//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);
}

A subop1() é executado pelo disparo de WSEV_MOUSE_IN, e torna a instância com o fundo realçado (a)(b). The subop2() é executado pelo disparo de WSEV_MOUSE_OUT, e torna o fundo ao seu estado original. O procedimento principal é executado por WSEV_INITIALIZE somente uma vez na execução do subprocedimento (E)(F).


Tornando um grupo selecionável de instâncias WSCvlabel

Pode-se tornar um grupo selecionável pelo mouse que tenha a classe base em comum.
O procedimento torna a instância selecionada pela armazenagem WS_SHADOW_IN na  propriedade WSNshadowType e memoriza qual instância é selecionada pelo arquivamento da mesma na instância base.

//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
}
}
As instâncias de etiquetas precisam itentificar cada instância para reconhecer qual instância é selecionada, então utiliza-se a propriedade WSNuserValue  como um identificador de instância com um valor único.


Document Release 3.80 for WideStudio ver 3.80, Jan 2005


WideStudio documents index | Table of contents

Copyright(C) WideStudio Development Team, 1999-2005 Last modified: Jan 05, 2005