FreeBASIC マニュアルのトップに戻る

FreeBASIC マウスを使う

目次→教本→いっしょに学ぼうUsing the Mouse in FreeBASIC←オリジナル・サイト

FreeBASIC でマウスを使う 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

 FreeBasic で、ウインドウズの実行画面アプリケーションで、マウスを操作する方法の例を、紹介します。
GETMOUSE
SETMOUSE
の項目も、参照下さい。

実行画面は、それがウインドウ・コンソールであるという事実から、マウスが考慮されています。そして、マウス操作は、ウィンドウズ API を使って行われることを意味します。つまり、実行画面から、マウスにアクセスできるのです。
それで、あなたのコードで、マウスをつけたり消したりする必要はありません。
あなたは、X と Y 座標を、Get か Set して、マウス・ボタンの状態を取得するだけでよいのです。
このチュートリアルでは、以下の対象をカバーします。

この項はチュートリアルなので、プログラムの例を使って説明します。
非常に簡単なプログラムを作って、マウスと、画面の一定の領域とのユーザの相互作用を、試します。
これは、あなた自身のプログラミング・プロジェクトで、マウスを効率的に操作してコントロールするのに必要なコードの基礎を、提供するでしょう。

重要: マウスを使うためには描画モードを使う必要があります。描画モードが設定されないと、マウス・コマンドは、値として、いつも -1 を返します。

編集者注:
- この教本で紹介されているように、マウスの機能は描画画面で動作します。
- 実行画面でも動作しますが、Windows ではクイック編集モードをオフにする必要があります。
(クイック・エディットと FreeBASIC マウスの競合は fbc version 1.08 から修正されました。)

サンプル・プログラム記述

デモンストレーション・プログラムでは、ことは、単純で、できるだけ簡単にするほうがよいでしょう。
このデモ・プログラムは、画面の上部に、3つの項目を表示します。あなたがマウスで、クリックした項目に対応して、異なったメッセージを画面の中央に表示します。
このプログラムは、FreeBasic でマウスで使う方法に関して、充分な情報を提供します。

FreeBasic には、基本的な、2 つのコマンドがあります。これらは、あなたのプロジェクトでマウスを扱うときに必要なものです。
下に、これらの構文と、説明を、記述しています。


GETMOUSE



構文:
result = GetMouse (x, y [, [ wheel ] [, [ buttons ] [, [ clip ]]]])

記述:
GETMOUSE は、マウス位置とボタンの状態を、検索します。

関数が呼ばれるとき、マウス位置は、X と Y に格納されます。
マウスがプログラムの窓の外に出ると、X と Y は、-1 になります。

'wheel' は、マウス・ホイール・カウンタです。
カウントは、あなたから遠くにホイールを回転させると増加します。あなたに向かって回転させると、減少します。
マウスが存在していないか、またはプログラムの窓の外なら、ホイールは、-1 を保持します。

'buttons' は、ボタンの状態を格納します。
関数終了のときに、これは、ボタンの状態を保持しながら、ビットマスクを返します。
マウス左ボタンを押すと、ビット 0 が設定されます。
マウスの右ボタンを押すと、ビット 1 が設定されます。
マウス中ボタンが押されると、ビット 2 が設定されます。

'clip' はマウスのクリッピング状態を保存します。 1 の場合、マウスは現在の描画ウィンドウにクリップされています。 0 の場合、マウスはクリップされていません。

* GETMOUSE は、描画モードで使います。SCREEEN 命令文だけを使って、設定して下さい。 *



SETMOUSE



構文:
result = SetMouse([ x ] [, [ y ] [, [ visibility ] [, [ clip ]]]])

記述:
SETMOUSE は、マウス・ポインタの X、Y 座標を設定し、その可視性も設定します。

マウス位置は、X と Y パラメータを使って設定されます。

visibility が 1 に設定されている場合はマウスが表示され、visibility が 0 に設定されている場合はマウスは表示されません。

clip - 1 はマウスが描画ウィンドウにクリップされていることを示し、0 はクリップされていないことを示します。

* SETMOUSE は、SCREEN 命令を使って開始された描画モード専用です。 *




コーディングを始めます

ここに、モジュールの始めに宣言する、一組の定数があります。
これは、ただ、後述のプログラミングの例で、コードが明快になるようにするためのものです。

    Const LEFTBUTTON = 1
    Const MIDDLEBUTTON = 4
    Const RIGHTBUTTON = 2
    Const SHOWMOUSE = 1
    Const HIDEMOUSE = 0


この例の最初のステップとして、プログラム例全体で使う変数を宣言します。
もちろん、あなたは変数を宣言する必要はありません、しかし、変数を宣言する意味をよく理解しているなら、変数を宣言して下さい。
これは良い習慣です。

編集者注:#lang FB では、変数を使う前に宣言する必要があります。

    Dim CurrentX As Integer
    Dim CurrentY As Integer
    Dim MouseButtons As Integer
    Dim CanExit As Integer
    Dim As String A,B,C


ここの考えは、ループの中のすべてをすることです。プログラムがループから出られるようにも制御できます。
それで、"CanExit" 変数が 0 と等しいときにループから出るように、ループを作成します。
ループでは、マウスの状態を詮索して、いくつかの基本的な値を表示します。
(この部分は gfxlib.txt ファイルの、GETMOUSE 構文説明で提供された例から、抽出しました。)
描画モードを設定するのを忘れないでください。これがマウス・コマンドから有効な戻り値を得るための必要条件です。
下の例では、Screen12 を使います。

Screen 12
CanExit = 1

Do While CanExit <> 0
    GetMouse CurrentX, CurrentY, , MouseButtons
    If CurrentX < 0 Then
        Print "Mouse is out of context."
    Else
        If MouseButtons And LEFTBUTTON Then A="L"
        If MouseButtons And MIDDLEBUTTON Then B="M"
        If MouseButtons And RIGHTBUTTON Then C="R"
        Print Using "Mouse position: ###:### Buttons: &&&"    ; CurrentX; CurrentY;A;B;C

        If C="R" Then CanExit = 0 : Sleep' 右クリックすると中断します。キー入力で終了します。

        A="":B="":C=""   
    End If
Loop


このサンプルは、マウスが、プログラムのウインドウ上にあれば、絶え間なく、マウスの場所を表示します。そして何かマウス・ボタンが押さると、その情報を表示します。
GETMOUSE 命令文は、CurrentXCurrentY 変数に、マウスの現在の XY 座標を入れます。そして、MouseButtons 変数に、マウス・ボタンの状態を入れます。
3つの If 命令文では、左のボタンが押されると、L を表示します。真ん中のボタン(または、ホイール)が押されると M を、そして、右ボタンが押されると、R を表示します。

次のステップで、マウスで何が起こっているかを制御するために、プログラムの始めにいくつかの余計な物を表示します。そして、ループで、その後、起こっていることを、制御します。
表示するものは、通常のテキストです。このテキストは、一連の行命令か、または、別のオプションのために、ボタンを描くものに、取り替えることができます。 しかし、このチュートリアルでは、そこまでは扱いません。
上でコードに、今までのところを追加して、求められていない Print 命令文を取り除くと、ループは、下のように書き換えることができます。

    Screen 12
    SetMouse 1, 1, 1
    CanExit = 1
    Locate 1,1
    Print " | FIRST | SECOND | THIRD | EXIT | "
    Do While CanExit <> 0
    Locate 1,1
    GetMouse CurrentX, CurrentY, , MouseButtons
    Loop


基本的に、画面の上部に、下の意味の行を表示します。
| FIRST | SECOND | THIRD | EXIT |
そして、マウスを詮索するループに入ります。
もちろん、このままでは、これに対応したコードが全くないので、あなたがボタンを押しても、何も起こりません。
この例では、選択されたオプションを、単純に表示するコードを加えます。
ユーザが、EXIT オプションを選択すると、そのオプションを表示して、ループを出ることにします。
ループの外で、print 命令を加えます。プログラムから抜けることを伝えて、ユーザがキー入力するまで sleep で待ちます。
これらをすべて織り込んだコードは、下のようになります。
全体のソースファイルをここに置いています。あなたは容易にそれを切って、貼ることができます。

Const LEFTBUTTON   = 1
Const MIDDLEBUTTON = 4   ' このデモでは、未使用
Const RIGHTBUTTON  = 2   ' このデモでは、未使用
Const SHOWMOUSE    = 1
Const HIDEMOUSE    = 0

Dim CurrentX     As Integer
Dim CurrentY     As Integer
Dim MouseButtons As Integer
Dim CanExit      As Integer

Screen 12
SetMouse 1, 1, SHOWMOUSE
CanExit = 1
Locate 1,1
Print " | FIRST | SECOND | THIRD | EXIT | "

Do
   GetMouse CurrentX, CurrentY, , MouseButtons
   If MouseButtons And LEFTBUTTON Then
      If CurrentY <= 12 Then
         If CurrentX >= 0 And CurrentX <=75 Then
            Locate 12, 1
            Print "First Option Selected ";
         ElseIf CurrentX >= 76 And CurrentX <= 147 Then
            Locate 12, 1
            Print "Second Option Selected";
         ElseIf CurrentX >= 148 And CurrentX <=212 Then
            Locate 12, 1
            Print "Third Option Selected ";
         ElseIf CurrentX >= 213 And CurrentX <=268 Then
            Locate 12, 1
            Print "Last Option Selected  ";
            Exit Do
         End If
      End If
   End If
Loop While Inkey$ = ""

SetMouse 1, 1, HIDEMOUSE
Print
PRINT "AND NOW WE'RE OUT OF THE LOOP"
Sleep


上のコードでは、たくさんの IF 命令文が使われています。
その数値は、SCREEN12 で返される座標に従って、計測してあります。
しかし、画素は、Console Graphics Window の画素なので、これらは、すべての描画モードで働くでしょう。
それぞれの IF は、画面に書かれている、それぞれのオプションに対応しています。
画像ボタンのルーチンを使用したいなら、どのボタンが押されたかを知る命令文のためのボタンを、同じサイズで描けば、同じ幅と高さを使用することができます。

結論として

お分かりのように、マウスを使用することは、FreeBasicで非常に簡単です。
あなたは、画面を描く print 命令のように、単純な命令文を使用できます。あるいは、画面に絵を描くために、LINE のような描画命令を使うことができます。
あなたが、画面を描くどの方法で選んでも、SETMOUSE と GETMOUSE 命令文は、同じように働いて、全く同じ値を返します。
あなたがしなければならないことは、マウスの情報を得て、ボタンを押したり、オプションを選択したときに、あなたのプログラムに、して欲しいことをさせるだけです。
ゲームの場合では、容易に、主人公を、あなたがスクリーンをクリックした位置へ向かうようにすることができます。
選択は、あなた次第です。

いつものように、何かこのチュートリアルについてか、その他、私が書いたことについて、質問がありましたら、遠慮なく私にメールしてください。そうすれば、私たちは、あなたの特定の問題を解決ために、なにかすることができるでしょう。


MystikShadows
srichard@adaworld.com
いっしょに学ぼう に戻る

最後、Sancho3 によるレビュー(2018年2月06日)

←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2020-10-14 00:51:10
日本語翻訳:WATANABE Makoto、原文著作者:JasonFirth

ホームページのトップに戻る

表示-非営利-継承