![]() | Programming Guide | WideStudio Index 目次 |
サンプルイベントプロシージャ・ラベル編
マウスで選択可能なラベルにするには
イベントプロシージャにおいて、 最も基本的なマウスの動作に反応するイベントプロシージャのサンプルです。 ラベル上でマウスがクリックされるたびに 数字がカウントアップされるイベントプロシージャを作成してみましょう。# WSEV_MOUSE_PRESS(MOUSE-PRESS)トリガ、でラベルに設定します。 use mpfc; sub cbop { my ($object) = @_; #(0)マウスボタン1以外はリターン if ((mpfc::WSGIappMouse()->getMouseStatus() & $mpfc::WS_MOUSE_BTN1) == 0){ return; } # (A)userValue プロパティに覚えている数字を取得 $value = $object->getProperty("userValue"); # (B)その数字をカウントアップ $val = $value->getLong() + 1; # (C)その数字の表示 $object->setProperty("labelString",$val); # (D) userValue プロパティにカウントアップした数字を覚えておく $object->setProperty("userValue",$val); return; } 1;まず、このイベントプロシージャは、WSCvbtn,WSCvlabel など、 labelString プロパティを持つオブジェクトに、MOUSE-PRESS トリガで 設定します。マウスボタンがオブジェクト上でマウスがクリックされるたび に、この関数は起動されます。 イベントプロシージャが起動されると、(0)で、マウスボタンの判定をおこ ない、マウスボタン1以外のボタンだったらリターンします。マウスボタン の判定の参考にしてください。
次に (A)で userValue プロパティに覚えている数字を取得します。 userValue プロパティは初期値は0で、ユーザが値を自由に指定して、 保持することができます。ここで、オブジェクトに覚えさせているのは、多 数のオブジェクトに貼られたとき、それぞれのラベルの数字が交じらない様 にするためです。逆にスタティック変数などに保持するように作成すると、 すべてのラベルで一つのカウンタを利用した表示が行えます。
次に(B)でその数字をカウントアップし、 (C)で表示します。(D)で表示した 数字を userValue プロパティに保持し、次のイベントプロシージャ起動 に備えます。
もし、トリガ、MOUSE-IN で張られた場合は、マウスの出 入りした回数を表示するでしょう。
マウスで選択可能なラベルにするには
次に、選択可能なラベルを作成してみましょう。ラベルが選択されている 様に見せるために、色を変化させてみましょう。今度は、userValue プロパティ の変わりにset/getVariantData() 関数を用いて選択状態を保持してみます。# WSEV_MOUSE_PRESS(MOUSE-PRESS)トリガでラベルに設定します。 use mpfc; sub cbop { my ($object) = @_; #(A) getVariantData() で覚えている値を取得 $value = $object->getVariantData("STATUS"); #(B) value が0だったら選択状態に、1だったら元の表示状態に戻す if ($value->getLong() == 0){ #(C)元の色名称(文字列)を userString で覚えておく $color = $object->getProperty("backColor"); $object->setProperty("userString",$color); #(D)選択色の表示状態にする $object->setProperty("backColor","slategray4"); #(E)状態を覚えておく $object->setVariantData("STATUS",1); }else{ #(F)元の色を取り出す $color = $object->getProperty("userString"); #(G)元の色の表示状態にする $object->setProperty("backColor",$color); #(H)状態を覚えておく $object->setVariantData("STATUS",0); } } 1;このイベントプロシージャは、WSCvbtn,WSCvlabel など、labelString プロパティを持つオブジェクトに、MOUSE-PRESS トリガで設定します。
イベントプロシージャが起動されると、(A)でsetVariantData() 関数で覚えてい る数字を取得します。set/getVariantData()関数は初期値は0で、ユーザが値 を自由に指定して、保持することができます。好きな名称を割り当てて、任 意の値を void* で保持しておくことが出来ます。
次に(B)でその値を判別し、 (C)で元の色を、次回、表示を元に戻すためにプ ロパティ userString で保持して、覚えておきます。次に(D) で選択色 での表示状態にし、(E)で再び選択状態を保持しなおします。
色を元に戻すフェーズは、(F)で保持しておいた元の表示色を取得して、 (G)でその色を反映します。(H) で再び選択状態を保持します。マウスでハイライトするラベルにするには
マウスのイン・アウトでハイライトするイベントプロシージャを作ってみま しょう。オブジェクト上にマウスが入ってくるとハイライトし、マウスが出 ていくともとに戻るイベントプロシージャになります。
ここで重要なことは、マウスが入った場合に発生するトリガと、マウスが出 た場合に発生するトリガにそれぞれイベントプロシージャを設定するイベン トプロシージャを作成するという点にあります。
すなわち初期化でイベントプロシージャが起動され、その中で新たなイベン トプロシージャを設定することで、複数のイベントプロシージャを一つのイ ベントプロシージャの設定で実現が可能となります。use mpfc; #サブEP1 #マウスイン sub subop1 { my ($object) = @_; #(A)元の色名称を userString プロパティに覚えておく $color = $object->getProperty("backColor"); $object->setProperty("userString",$color); #(B)選択色の表示状態にする $object->setProperty("backColor","slategray4"); return; } #サブEP2 #マウスアウト sub subop2 { my ($object) = @_; #(C)元の色名称を取り出す $color = $object->getProperty("userString"); #(D)元の色の表示状態にする $object->setProperty("backColor",$color); } #WSEV_INIT(INITIALIZE)トリガでラベルに設定します。 sub cbop { my ($object) = @_; #初期化トリガが発生して実行されると #サブEPを、それぞれ新しく設定します。 #(E)イベントプロシージャの新規設定 #サブEP1 #OP名称="ハイライトOP1" 関数=subop1 起動トリガ=WSEV_MOUSE_IN $object->addProcedure("ハイライトOP1","subop1",$mpfc::WSEV_MOUSE_IN); #(F)イベントプロシージャの新規設定 #サブEP2 #OP名称="ハイライトOP2" 関数=subop2 起動トリガ=WSEV_MOUSE_OUT $object->addProcedure("ハイライトOP2","subop2",$mpfc::WSEV_MOUSE_OUT); } 1;サブEP1は、マウスインのトリガで起動し、ラベルの背景表示色をハイライ ト色にします。サブEP2は、マウスアウトのトリガで起動し、ラベルの背景 表示色を元の色に戻します。イベントプロシージャ本体は、初期化トリガで オブジェクトに設定されており、(E)、(F)でサブEP1,2をオブジェクトに設 定しています。以後、マウスがインアウトすると、新しくプログラムの中か ら設定されたサブEPが実行されるようになります。マウスで選択可能なグループ化されたラベルにするには
同じエリア上に配置されるラベルを、マウスで選択可能なグループ化された ラベルにするイベントプロシージャを実装するために、マウスで選択された ラベルを陥没状態にして、そのエリアにどのラベルが選択されているかを保 持するようにします。user mpfc; # WSEV_MOUSE_PRESS(MOUSE-PRESS)トリガでラベルに設定します。 sub cbop { my ($object) = @_; #(A)userValue プロパティに設定されている値をIDとして使用する $val = $object->getProperty("userValue"); #(B)選択された状態(陥没状態)にする $object->setProperty("shadowType",$mpfc::WS_SHADOW_IN); #(C)親に覚えている選択されていたオブジェクトを取得する $parent = $object->getParent(); $target = $parent->getVariantData("SelectedItem"); #(D)その選択されていたオブジェクトの表示状態を元(突出状態)に戻す $target_obj = $target->getInstancePtr(); if (mpfc::WSGIappObjectList()->existInstance($target_obj) != $mpfc::False){ $target_obj->setProperty("shadowType",$mpfc::WS_SHADOW_OUT); } if (mpfc::WSGIappObjectList()->existInstance($target_obj) != $mpfc::False && $target_obj->getInstanceName() == $object->getInstanceName()){ #(E)選択しているオブジェクトをもう一度つついた場合 # 二度目の選択の場合は、覚えていた自分を0にして忘れる $parent->setVariantData("GroupValue",0); $parent->setVariantData("SelectedItem",0); }else{ #(F)一度目の選択の場合は、自分を親に登録。 $parent->setVariantData("GroupValue",val); # ID $parent->setVariantData("SelectedItem",$object); # WSCbaseインスタンス } } 1;グループ化するラベル達に、それぞれ識別するための ID が必要になります が、userValue プロパティに設定されている値を ID として使用するこ とにします。
(A)で userValue プロパティに設定されている ID を取得します。
(B)で選択されたことを示すため、陥没枠表示にします。
(C)で選択されていたオブジェクトを取得します。どのオブジェクトでも良 いのですが、この例の場合、グループ化するラベル達に共通な親オブジェク トに覚えておきます。
(D)で選択されていたオブジェクトの表示状態をもとの突出状態に戻します。
(E)で選択されていたオブジェクト(target)と、新たに選択されたオブジェ クト(object)が等しい場合、すなわち、2度選択された状態になった場合、 解除します。親に覚えていた値とオブジェクトをリセットします。
(F)では、新たに選択されたオブジェクトと値を親に覚え直します。
Copyright(C) T. Hirabayashi, 2000-2004 | Last modified: Feb 25, 2004 |