第6回 Palmに動作を伝えよう 〜 イベントのお話 〜「2.画面をタップ その1」

6−2 画面をタップ その1

押したり回したり、様々なイベントがある中で、それらをまとめてみると次の4つのイベントに分類できます。
  • ペンが画面についた
  • ペンが画面から離れた
  • ボタンが押された
  • ジョグダイヤルが回った
プログラム中では、これらのイベントが発生した時に、すべて、Formの[events]が実行されますので、そこでどの種類のイベントが発生したのかをチェックしなければなりません。
このチェックを、NS Basicでは「GetEventType()」という関数を使います。
GetEventType()の戻り値は次の通りです

   ペンが画面についたNsbPenDown
ペンが画面から離れたNsbPenUp
ボタンが押されたNsbKeyorButton
ジョグダイヤルが使われたNsbJogDial

プログラム中では次のように使います。
    If GetEventType()=NsbPenDown Then
        (処理)
    End if
複数のイベントをチェックする場合は、Select Caseの方が良い場合もありますが、その辺りは、状況に合わせて選択してください。
ただ、戻り値が長い横文字だなぁ、と思うかもしれませんね。これらは「nsb」で始まる値は「組み込み定数」と呼ばれ、実際は数値が入っています。
例えば、NsbPenDownは 1、NsbJogDialは 4といった具合で、先ほどの例では、
    If GetEventType()=1 Then
としても同じ結果になります。したがって、これはどちらでも良いのですが、本稿では、組み込み定数の方を使うことにします。

では、まず、ペン関係のイベントです。
ペン関連の「押された」「離れた」というイベントに対して、プログラム中からそのイベントが発生した「座標」を得ることができます。
グラフィック関連のところでも出てきましたが、画面の座標は左上が(0,0)で右下が(159,159)でしたね。
ペンのイベントでは、画面を押した、もしくは離れた時の座標を得ることができ、これには「GetPen」コマンドを使います。
GetPenの書式は、
    GenPen PenX,PenY,PenStatus
        PenX:ペンのX座標
        PenY:ペンのY座標
        PenStatus:ペンの状態、NsbPenDown、NsbPenUpの何れかを指定します。
例えば、ペンがタップされた時の座標を得る場合は、
    Dim X as Integer
    Dim Y aa Integer

    If GetEventType()=NsbPenDown Then
        GetPen X,Y,NsbPenDown

    End If
というようにすれば、タップした時の座標が変数X,Yに入ります。
簡単なサンプルを作ってみましょう。タップした座標に画像を表示するだけのサンプルです。
    Dim X as Integer
    Dim Y as Integer

    If GetEventType()=NsbPenDown Then
        GetPen X,Y,NsbPenDown
        DrawBitmap 1005,X,Y
    End If
とすれば、ペンをタップした位置に画像(1005)を表示することができます。

また、例えば、Global変数と組み合わせれば
[Startup]
    Global X1 as Integer
    Global Y1 as Integer

[events]
    Dim X2 as Integer
    Dim Y2 as Integer
    
    If GetEventType()=nsbPenDown Then
        GetPen X1,Y1,nsbPenDown
    End If

    If GetEventType()=nsbPenUp Then
        GetPen X2,Y2,nsbPenUp
        DrawLine X1,Y1,X2,Y2        
    End If
とすれば、画面にペンがついた位置から、離した位置まで直線を引きます。 グラフィックツールのようにペンを移動させている軌跡とは無関係に直線を引きますので、お絵描きにはつかえそうにはありませんが、連続的な線を引くには、次のようにすれば引けないことはありません。
[Startup]
    Global X1 as Integer
    Global Y1 as Integer

[events]

    Dim X2 as Integer
    Dim Y2 as Integer
    
    If GetEventType()=nsbPenDown Then
        X2=X1
        Y2=Y1
        GetPen X1,Y1,nsbPenDown
        DrawLine x1,y1,x2,y2
    End If
このように、ペン関連のイベントが発生した場合、ペンが画面に触れたか離れたか、をチェックすることができ、また、その発生した位置を取得できますので、これは直感的に理解しやすいイベントですね。
実際は、画面のタップにペンではなく指を使う場合もありますが、タップしたものが「ペン」か「指」かをチェックする関数はありませんのであしからず。


前へ     目次へ     次へ

第6回 Palmに動作を伝えよう 〜 イベントのお話 〜「2.画面をタップ その1」