![]() | Programming Guide | WideStudio/MWT Index 目次 |
サンプルイベントプロシージャ・ラベル編
マウスで選択可能なラベルにするには
イベントプロシージャにおいて、 最も基本的なマウスの動作に反応するイベントプロシージャのサンプルです。 ラベル上でマウスがクリックされるたびに 数字がカウントアップされるイベントプロシージャを作成してみましょう。#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)では、新たに選択されたインスタンスと値を親に覚え直します。
Copyright(C) WideStudio/MWT Development Team, 1999-2005 | Last modified: Jul 31, 2005 |