アプリケーションは,左マウス・ボタンを押す,右マウス・ボタンを押す,ダブルクリックといったマウス・イベントを検出し,それに応答することができます。マウス・イベントは,キーボード入力の代わりとして,または画面上に表示されているものを操作するための手段として使用することができます。
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 回目のクリックに対して BUTTONDOWN と BUTTONUP,2 回目のクリックに対して BUTTONDBLCLK と BUTTONUP と,合わせて 4 つのイベントが発生します。2 回目のクリックに対して BUTTONDBLCLK と BUTTONDOWN のどちらが発生するかは,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 に返し,イベントが発生した時点でのマウスの位置をパラメタ x と y に返します。
マウス・イベントは,WAITONMOUSEEVENT が呼び出された時点でフォーカスを持っていたウィンドウ中で起こらなくてはなりません。他のウィンドウでマウス・イベントが発生しても,待機は終わりません。他のウィンドウの中で起こったマウス・イベントは,そのウィンドウに対して登録されていたコールバックを引き起こします。
QuickWin は,マウス・イベントに基づいていくつかの動作を実行します。マウス・イベントを使ってフル・スクリーン・モードから戻り,テキストやグラフィックスをクリップボードにコピーするために選択します。マウス・イベント関数の処理は,フル・スクリーン・モードから返ることよりも優先されます。ただし,マウス・イベント関数の処理よりは,「Cut/Paste」選択モードの方が優先されます。選択モードが終わった時点で,マウス・イベント関数の処理が再開されます。