マウスの使用

アプリケーションは,左マウス・ボタンを押す,右マウス・ボタンを押す,ダブルクリックといったマウス・イベントを検出し,それに応答することができます。マウス・イベントは,キーボード入力の代わりとして,または画面上に表示されているものを操作するための手段として使用することができます。

QuickWin は 2 つの形式のマウス関数を用意しています。

マウスは非同期的な装置なので,ユーザーはアプリケーションの実行中はいつでもマウスをクリックすることができます (つまり,マウス入力は他の何の要素とも同期する必要がありません)。マウスのクリックが行われると,Windows はアプリケーションに対してメッセージを送り,アプリケーションはこのメッセージに応じて適切な動作を実行します。アプリケーションにおけるマウスのサポートは,一般にイベントを基本として行われます。つまり,マウスのクリックが起こると,それに応じてアプリケーションが何らかの処理を行うという形になります。

ただし,アプリケーションはブロック関数を使って,マウスのクリックを待つこともできます。これにより,アプリケーションは特定の順番で動作すると同時に,マウスのサポートを提供することができます。QuickWin はマウス・イベントに基づいて基本 QuickWin 処理を行います。

マウス・カーソルの形状を変えるには,SETMOUSECURSOR を使用します。

イベントを基本とした関数

QuickWin 関数の REGISTERMOUSEEVENT は,特定のマウス・イベント (左マウス・ボタン,右マウス・ボタン,ダブルクリックなど) が起こったときに呼び出されるルーチンを登録します。プログラマは,どのようなイベントを処理したいのか,またそれらのイベントが起こったときにどのルーチンが呼び出されるのかを定義します。UNREGISTERMOUSEEVENT は,これらのルーチンの登録を解除します。これにより,QuickWin はこれらのルーチンを呼び出さず,そのイベントの基本処理を使用します。

基本設定では,QuickWin は一般にメニューかダイアログ・コントロール上でマウスのクリックが起こった場合を除いて,イベントを無視します。最小化されたウィンドウではイベントは受信されないことに注意してください。マウス・イベントを起こさせるためには,ウィンドウを復元または最大化する必要があります。

次に例を示します。

	USE DFLIB
	INTEGER(4) result
	OPEN (4, FILE= 'USER')
	...
	result = REGISTERMOUSEEVENT (4, MOUSE$LBUTTONDBLCLK, CALCULATE)

このコードは,マウスのカーソルが装置 4 として開かれた子ウィンドウの中にあるときに,ユーザーが左マウス・ボタンでダブルクリックした場合に呼び出されるルーチン CALCULATE を登録しています。次表に,マウス・イベントを識別するために使われるシンボル定数を示します。

マウス・イベント1 説明
MOUSE$LBUTTONDOWN 左マウス・ボタンを押す
MOUSE$LBUTTONUP 左マウス・ボタンをはなす
MOUSE$LBUTTONDBLCLK 左マウス・ボタンをダブルクリックする
MOUSE$RBUTTONDOWN 右マウス・ボタンを押す
MOUSE$RBUTTONUP 右マウス・ボタンをはなす
MOUSE$RBUTTONDBLCLK 右マウス・ボタンをダブルクリックする
MOUSE$MOVE マウスの移動する

1 個々の BUTTONDOWN および BUTTONDBLCLK イベントについて,BUTTONUP イベントが関連付けられています。ユーザーがダブルクリックを行うと,1 回目のクリックに対して BUTTONDOWNBUTTONUP,2 回目のクリックに対して BUTTONDBLCLKBUTTONUP と,合わせて 4 つのイベントが発生します。2 回目のクリックに対して BUTTONDBLCLKBUTTONDOWN のどちらが発生するかは,2 回目のクリックが,システムの「コントロールパネル」の「マウス」で設定されているダブルクリック間隔の前に行われるかどうかに依存します。

前の例のルーチンを登録解除するには,次のコードを使用します。

	result = UNREGISTERMOUSEEVENT (4, MOUSE$LBUTTONDBLCLK)

以前の呼び出しを登録解除しないまま,REGISTERMOUSEEVENT を再び呼び出すと,以前の呼び出しは置換されます。その後,そのイベントに対しては新しいコールバック・ルーチンが呼び出されるようになります。

マウス・イベントが起こったときに呼び出されるコールバック・ルーチンは,次のプロトタイプを持っていなくてはなりません。

	INTERFACE
	  SUBROUTINE MouseCallBackRoutine (unit, mouseevent, keystate,   &
	   & MouseXpos,MouseYpos)
	     INTEGER unit
	     INTEGER mouseevent
	     INTEGER keystate
	     INTEGER MouseXpos
	     INTEGER MouseYpos
	  END SUBROUTINE
	END INTERFACE

unit パラメタは,イベントの検出を行う子ウィンドウに関連付けられている装置番号で,mouseevent パラメタは上の表に示したいずれかのパラメタです。MouseXpos および MouseYpos パラメタは,イベント発生時点での X および Y 位置を指定します。

keystate パラメタは,マウス・イベント発生時点での Shift キーと CTRL キーの状態を示し,次表に示す定数の任意の論理和を指定することができます。

Keystate パラメタ 説明
MOUSE$KS_LBUTTON イベント発生時点で左マウス・ボタンが押された。
MOUSE$KS_RBUTTON イベント発生時点で右マウス・ボタンが押された。
MOUSE$KS_SHIFT イベント発生時点で Shift キーが押され続けていた。
MOUSE$KS_CONTROL イベント発生時点で CTRL キーが押され続けていた。

マウス・イベントのための QuickWin コールバック・ルーチンは,最小限の処理を行って返るようにしなくてはなりません。コールバックの処理中はメッセージの処理が行われないため,プログラムは応答しなくなったように見えるので,迅速に返ることが重要です。コールバック中で多くの処理時間が必要な場合,その作業を行うために別のスレッドを開始するべきです。スレッドは Win32 API の CreateThread を呼び出すことで作成できます (スレッドの作成と使用についての詳細は,「マルチスレッド・アプリケーションの作成」を参照)。コールバック・ルーチンが新しいスレッドを開始しない場合,コールバックは処理を終えるまでは再び呼び出されることはありません。


注意:イベントを基本とした関数では,イベントのバッファリングは行われません。このため,マルチスレッド化や共有リソース参照の同期といった問題に対処する必要があります。マルチスレッド化に関連する問題を避けるには,イベントを基本とした関数ではなくブロック関数を使用するようにしてください。ブロック関数は順番に処理を進めるアプリケーションに適しています。順番に実行される処理の流れがほとんどなく,ユーザーがあちこちに飛び回るアプリケーションは,イベントを基本とした関数として実装した方がいいでしょう。

ブロック (順番) 関数

QuickWin ブロック関数 WAITONMOUSEEVENT は,特定のマウス入力が受信されるまで実行をブロックします。この関数は,キーストロークではなくマウス・イベントを待つという点を除けば,INCHARQQ に似ています。

次に例を示します。

	    USE DFLIB
	    INTEGER(4) mouseevent, keystate, x, y, result
	    ...
	    mouseevent = MOUSE$RBUTTONDOWN .OR. MOUSE$LBUTTONDOWN
	    result = WAITONMOUSEEVENT (mouseevent, keystate, x , y)
	!   Wait until right or left mouse button clicked,
	!   then check the keystate with the following:
	    if ((MOUSE$KS_SHIFT .AND. keystate) == MOUSE$KS_SHIFT) then &
	   & write (*,*) 'Shift key was down'
	    if ((MOUSE$KS_CONTROL .AND. keystate) == MOUSE$KS_CONTROL) then &
	   & write (*,*) 'Ctrl key was down'

アプリケーションは WAITONMOUSEEVENT に対して,マウス・イベントの任意の OR をとったマウスのイベント・パラメタを渡します。その後,関数はいずれかの指定されたイベントが発生するまで待ち,実行をブロックします。イベントが発生すると,Shift キーと CTRL キーの状態をパラメタ keystate に返し,イベントが発生した時点でのマウスの位置をパラメタ xy に返します。

マウス・イベントは,WAITONMOUSEEVENT が呼び出された時点でフォーカスを持っていたウィンドウ中で起こらなくてはなりません。他のウィンドウでマウス・イベントが発生しても,待機は終わりません。他のウィンドウの中で起こったマウス・イベントは,そのウィンドウに対して登録されていたコールバックを引き起こします。

基本 QuickWin 処理

QuickWin は,マウス・イベントに基づいていくつかの動作を実行します。マウス・イベントを使ってフル・スクリーン・モードから戻り,テキストやグラフィックスをクリップボードにコピーするために選択します。マウス・イベント関数の処理は,フル・スクリーン・モードから返ることよりも優先されます。ただし,マウス・イベント関数の処理よりは,「Cut/Paste」選択モードの方が優先されます。選択モードが終わった時点で,マウス・イベント関数の処理が再開されます。