![]() |
サンプルイベントプロシージャ・ラベル編マウスで選択可能なラベルにするにはイベントプロシージャにおいて、 最も基本的なマウスの動作に反応するイベントプロシージャのサンプルです。 ラベル上でマウスがクリックされるたびに 数字がカウントアップされるイベントプロシージャを作成してみましょう。#include "WSDmouse.h" //WSEV_MOUSE_PRESS(MOUSE-PRESS)トリガ、でラベルに設定します。 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 トリガで設定します。 マウスボタンがオブジェクト上でマウスがクリックされるたびに、この関数は起動されます。 イベントプロシージャが起動されると、(0)で、マウスボタンの判定をおこない、マウスボタン1以外の ボタンだったらリターンします。マウスボタンの判定の参考にしてください。 次に (A)でWSNuserValue プロパティに覚えている数字を 取得します。WSNuserValue プロパティは初期値は0で、ユーザが値を自由に指定して、 保持することができます。ここで、オブジェクトに覚えさせているのは、 多数のオブジェクトに貼られたとき、それぞれのラベルの数字が交じらない 様にするためです。逆にスタティック変数などに保持するように作成すると、 すべてのラベルで一つのカウンタを利用した表示が行えます。 次に(B)でその数字をカウントアップし、 (C)で表示します。(D)で表示した数字を WSNuserValue プロパティに保持し、次のイベントプロシージャ起動に備えます。 もし、トリガ、MOUSE-IN で張られた場合は、マウスの出入りした回数を表示するでしょう。 マウスで選択可能なラベルにするには次に、選択可能なラベルを作成してみましょう。ラベルが選択されている 様に見せるために、色を変化させてみましょう。今度は、WSNuserValue プロパティ の変わりにset/getUserData() 関数を用いて選択状態を保持してみます。//WSEV_MOUSE_PRESS(MOUSE-PRESS)トリガでラベルに設定します。 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)選択色の表示状態にする 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 トリガで設定します。 イベントプロシージャが起動されると、(A)でsetUserData() 関数で覚えている数字を 取得します。set/getUserData()関数は初期値は0で、ユーザが値を自由に指定して、 保持することができます。好きな名称を割り当てて、 任意の値を void* で保持しておくことが出来ます。 次に(B)でその値を判別し、 (C)で元の色を、次回、表示を元に戻すために プロパティ WSNuserString で保持して、覚えておきます。 次に(D) で選択色での表示状態にし、(E)で再び選択状態を保持しなおします。 色を元に戻すフェーズは、(F)で保持しておいた元の表示色を取得して、 (G)でその色を反映します。(H) で再び選択状態を保持します。 マウスでハイライトするラベルにするにはマウスのイン・アウトでハイライトするイベントプロシージャを作って みましょう。オブジェクト上にマウスが入ってくるとハイライトし、 マウスが出ていくともとに戻るイベントプロシージャになります。ここで重要なことは、マウスが入った場合に発生するトリガと、 マウスが出た場合に発生するトリガにそれぞれイベントプロシージャを設定する イベントプロシージャを作成するという点にあります。 すなわち初期化でイベントプロシージャが起動され、 その中で新たなイベントプロシージャを設定することで、 複数のイベントプロシージャを一つのイベントプロシージャの 設定で実現が可能となります。 //サブ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)トリガでラベルに設定します。 void cbop(WSCbase* object){ //初期化トリガが発生して実行されると //サブEPを、それぞれ新しく設定します。 //(E)イベントプロシージャの新規設定//サブEP1 //OP名称="ハイライトOP1" 起動トリガ=WSEV_MOUSE_IN 関数=subop1 WSCprocedure* ac1 = new WSCprocedure("ハイライトOP1",WSEV_MOUSE_IN); ac1->setFunction(subop1,"subop1"); object->addProcedure(ac1); //(F)イベントプロシージャの新規設定//サブEP2 //OP名称="ハイライトOP2" 起動トリガ=WSEV_MOUSE_OUT 関数=subop2 WSCprocedure* ac2 = new WSCprocedure("ハイライトOP2",WSEV_MOUSE_OUT); ac2->setFunction(subop2,"subop2"); object->addProcedure(ac2); }サブEP1は、マウスインのトリガで起動し、ラベルの背景表示色をハイライト色に します。サブEP2は、マウスアウトのトリガで起動し、 ラベルの背景表示色を元の色に戻します。イベントプロシージャ本体は、 初期化トリガでオブジェクト に設定されており、(E)、(F)でサブEP1、2をオブジェクトに設定しています。 以後、マウスがインアウトすると、新しくプログラムの中から設定されたサブEPが 実行されるようになります。 マウスで選択可能なグループ化されたラベルにするには同じエリア上に配置されるラベルを、 マウスで選択可能なグループ化されたラベルにするイベントプロシージャを実装するために、 マウスで選択されたラベルを陥没状態にして、そのエリアにどのラベルが 選択されているかを保持するようにします。//WSEV_MOUSE_PRESS(MOUSE-PRESS)トリガでラベルに設定します。 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)が 等しい場合、すなわち、2度選択された状態になった場合、解除します。 親に覚えていた値とオブジェクトをリセットします。 (F)では、新たに選択されたオブジェクトと値を親に覚え直します。 Document Release 3.00 For Use with Wide Studio Release 3.00, Summper 2002
|