| WideStudio Programming Guide | WideStudio Index Table of contents

> ## 샘플 이벤트 프로시저:라벨편

> ### 마우스로 선택가능한 라벨로 하기에는

> 이벤트 프로시저에 있어서 가장 기본적인 마우스의 동작에 반응하는 이벤트 프로시저의 샘플입니다. 라벨위에서 마우스가 클릭될때마다 숫자가 올라가게되는 이벤트 프로시저를 작성해봅시다.

>     #include <WSDmouse.h>
>     //WSEV_MOUSE_PRESS(MOUSE-PRESS) 트리거(trigger)로 라벨에 설정합니다.
>     void cbop(WSCbase* object){

>       //(0) 마우스 단추1외는 되돌아감
>       if ( (WSGIappMouse()->getMouseStatus() & WS_MOUSE_BTN1) == 0){
>         return;
>       }

>       //(A)WSNuserValue  속성에 기억되여있는 숫자를 취득
>       long value = object->getProperty(WSNuserValue);
>       //(B)그 숫자를 세어 올림
>       value++;
>       //(C)그 숫자의 표시
>       object->setProperty(WSNlabelString,value);
>       //(D)WSNuserValue  속성에 올린 숫자를 기억시킴
>       object->setProperty(WSNuserValue,value);
>     }

> 이 이벤트 프로시저는 WSCvbtn,WSCvlabel 등의 WSNlabelString 속성을 가지는 객체에 MOUSE-PRESS 트리거(trigger)로 설정합니다. 객체위에서 마우스가 클릭될때마다 이 함수는 기동됩니다. 이벤트 프로시저가 기동되면 (0)에서 마우스 단추의 판정을 실행하고 마우스 단추1외의 단추였더라면 되돌립니다. 마우스 단추 판정의 참고로 해 주십시오.
> 다음에 (A)로 WSNuserValue속성에 기억되여있는 숫자를 취득합니다. WSNuserValue 속성의 초기치는 0으로, 사용자가 값을 자유로히 지정해서 보지 할수 있습니다. 여기서 객체에 기억시켜놓은것은 다수의 객체에 붙여놓였을때 각각의 라벨의 숫자가 섞여지지않도록 하기위해서입니다. 반대로 정적 변수등에서 보지하도록 작성하면 모든 라벨에서 하나의 숫자를 사용한 표시를 할수있습니다.
> 다음에 (B)에서 그 숫자를 세어 올려 (C)에서 표시합니다. (D)로 표시한 숫자를 WSNuserValue속성에 보지하여, 다음번의 이벤트 프로시저 기동에 준비합니다.
> 혹시 이 프로시저가 트리거(trigger),MOUSE-IN 로 붙여놓인 경우는, 마우스가 출입한 회수를 표시하게됩니다.

> ### 마우스로 선택가능한 라벨로 하기에는

> 다음은 선택가능한 라벨을 작성해봅시다. 라벨이 선택된것처럼 보이도록 색을 변화시켜봅시다. 여기서는 WSNuserValue 속성의 대신 set/getUserData() 함수를 써서 선택상태를 보지합니다.

>     //WSEV_MOUSE_PRESS(MOUSE-PRESS) 트리거(trigger)로 라벨에 설정합니다.
>     void cbop(WSCbase* object){
>       //(A) getUserData() 로 기억하는 값을 취득
>       long value =  (long)object->getUserData("STATUS");
>       //(B) value 가 0이며는 선택상태로, 1이며는 원래 표시상태로 되돌린다
>       if (value == 0){
>         //(C)월래색명칭( 문자열)을 WSNuserString 로 기억해놓다
>         WSCvariant color = object->getProperty(WSNbackColor);
>         object->setProperty(WSNuserString,color);
>         //(D) 선택색의 표시$B>uBV(B상태로 한다
>         object->setProperty(WSNbackColor,"slategray4");
>         //(E)상태를 기억한다
>         value = 1;
>         object->setUserData("STATUS",(void*)value);
>       }else{
>         //(F)원래색을 꺼낸다
>         WSCvariant color =  object->getProperty(WSNuserString);
>         //(G)원래색의 표시상태로 한다
>         object->setProperty(WSNbackColor,color);
>         //(H)상태를 기억한다
>         value = 0;
>         object->setUserData("STATUS",(void*)value);
>       }
>     }

> 이 이벤트 프로시저는 WSCvbtn,WSCvlabel 등의 WSNlabelString 속성을 가지는 객체에 MOUSE-PRESS 트리거(trigger)로 설정합니다.
> 이벤트 프로시저가 기동되면 (A)에서 setUserData() 함수가 기억하는 숫자를 취득합니다. set/getUserData() 함수의 초기치는0으로 사용자가 값을 자유로히 지정해서 보지할수있습니다. 좋은 이름을 붙여서 임의의 값을 void* 형으로 보지할수가 있습니다.
> 다음에 (B)에서 그 값을 판별하다가, (C)에서 다음번에 원래색으로 표시를 되돌리기에 속성 WSNuserString 로 기억해놓습니다. 다음 (D) 에서 선택색으로의 표시상태로 하다가, (E)로서 선택상태를 다시 보지합니다.
> 원래색으로 되돌리는 단계는 (F)로서 보지해놓은 원래 표시색을 취득해서 (G)로 그 색을 반영합니다. 그래서 (H)에서 또 선택상태를 보지합니다.

> ### 마우스로 강조표시하는 라벨로 하기에는

> 마우스의 출입으로 강조표시하는 이벤트 프로시저를 만들어봅시다. 객체위에 마우스가 들어오면 강조표시하고, 마우스가 나가면 되돌아가는 이벤트 프로시저로 됩니다.
> 여기서 중요한것은 마우스가 들어간 경우에 발생하는 트리거(trigger)와 마우스가 나간 경우에 발생하는 트리거(trigger)에 각각 이벤트 프로시저를 설정하는 이벤트 프로시저를 작성한다는 점에 있습니다.
> 즉 초기화로 이벤트 프로시저가 기동되여, 그속에서 새로운 이벤트 프로시저를 설정함으로서 복수의 이벤트 프로시저의 설정을 하나의 이벤트 프로시저의 설정으로 실현하는 점입니다.

>     //서브EP1 // 마우스 들어감
>     void subop1(WSCbase* object){
>         //(A)원래색 명칭을 WSNuserString  속성에 기억시킨다
>         WSCvariant color = object->getProperty(WSNbackColor);
>         object->setProperty(WSNuserString,color);
>         //(B) 선택색의 표시상태로 한다
>         object->setProperty(WSNbackColor,"slategray4");
>     }
>     //서브EP2 // 마우스 나감
>     void subop2(WSCbase* object){
>         //(C)원래색 명칭을 꺼낸다
>          WSCvariant color = object->getProperty(WSNuserString);
>         //(D)원래 표시상태로 한다
>         object->setProperty(WSNbackColor,color);
>     }
>     //WSEV_INIT(INITIALIZE) 트리거(trigger)로 라벨에 설정한다.
>     void cbop(WSCbase* object){
>        // 초기화 트리거(trigger)가 발생하여 실행되면
>        //서브EP를 각각 새로 설정합니다.
>        //(E) 이벤트 프로시저의 신규 설정  //서브EP1
>        //OP명칭="강조OP1"      기동 트리거(trigger)=WSEV_MOUSE_IN      함수=subop1
>        WSCprocedure* ac1 = new WSCprocedure("강조OP1",WSEV_MOUSE_IN);
>        ac1->setFunction(subop1,"subop1");
>        object->addProcedure(ac1);
>        //(F) 이벤트 프로시저의 신규 설정  //서브EP2
>        //OP명칭="강조OP2"      기동 트리거(trigger)=WSEV_MOUSE_OUT     함수=subop2
>        WSCprocedure* ac2 = new WSCprocedure("강조OP2",WSEV_MOUSE_OUT);
>        ac2->setFunction(subop2,"subop2");
>        object->addProcedure(ac2);
>     }

> 서브EP1는 WSEV_MOUSE_IN의 트리거(trigger)로 기동되여 라벨의 배경표시색을 강조색으로 합니다. 서브EP2는 WSEV_MOUSE_OUT의 트리거(trigger)로 기동되여 라벨의 배경표시색을 원래 색으로 되돌립니다. 이벤트 프로시저본체는 초기화 트리거(trigger)로 객체에 설정되여있으며 (E),(F)에서 서브EP1,2를 객체에 설정하고있습니다. 이후 마우스가 출입을하면 새로 프로그램의 안에서 설정된 서브EP가 실행되도록 됩니다.

> ### 마우스로 선택가능한 그룹화된 라벨로 하기에는

> 같은 에리어위에 배치되는 라벨을 마우스로 선택가능한 그룹화된 라벨에하는 이벤트 프로시저를 실정하기에는 마우스로 선택된 라벨을 함몰한 상태로 해놓고 그 에리어에 어느 라벨이 선택되여있는가를 보지하도록합니다.

>     //WSEV_MOUSE_PRESS(MOUSE-PRESS) 트리거(trigger)로 라벨에 설정합니다.
>     void cbop(WSCbase* object){
>       //(A)WSNuserValue  속성에 설정되여있는 값을 ID로서 사용한다
>       long val = object->getProperty(WSNuserValue);
>       //(B) 선택된 상태(함몰강태)로 한다
>       object->setProperty(WSNshadowType,WS_SHADOW_IN);
>       //(C)부모가 기옥하는 선택되여있던 객체를 취득한다
>       WSCbase* parent = object->getParent();
>       WSCbase* target = (WSCbase*)parent->getUserData("SelectedItem");
>       //(D)그 선택되여있던 객체의 표시상태를 원래상태(돌출상태)로 되돌린다
>       if (target != NULL){
>         target->setProperty(WSNshadowType,WS_SHADOW_OUT);
>       }

>       if (target == object){
>         //(E) 선택하고있는 객체를 다시 클릭한 경우
>         //두번째의 경우는 왜우고있던 자신을 0으로해서 치운다
>         parent->setUserData("GroupValue",(void*)0);
>         parent->setUserData("SelectedItem",(void*)0);
>       }else{
>         //(F)첫번째의 경우는 자신을 부모에 기억시킴.
>         parent->setUserData("GroupValue",(void*)val);      //ID
>         parent->setUserData("SelectedItem",(void*)object); //WSCbase*  포인터
>       }
>     }

> 그룹화하는 라벨들에 각각을 식별할 ID가 필요하지만 WSNuserValue 속성에 설정되여있는 값을 ID 로 사용하더록합시다.
> (A)에서 WSNuserValue 속성에 설정되여있는 ID 를 취득합니다.
> (B)에서는 선택된것을 표시하기위해 함몰틀 표시로 합니다.
> (C)로서 선택되여있던 객체를 취득합니다. 어느 객체나 문제없지만 이 예의 경우, 그룹화하는 라벨들에 공통인 부모객체에 기억시키도록합니다.
> (D)는 선택되여있던 객체의 표시상태를 원래의 돌출상태에 되돌립니다.
> (E)로 선택되여있던 객체(target)와 새로 선택된 객체(object)가 같은경우, 측 두번 선택된 상태로 된 경우에는 해저합니다. 부모에 기억시킨 값과 객체를 치웁니다.
> (F)에서는 새로 선택된 객체와 그 값을 부모에 기억시킵니다.

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