HSP3 あれこれ <マウス>

Last Update : 2008/06/xx

◆ マウス

 Win32 API関数やウィンドウメッセージ(oncmd命令)を利用したマウス関連の発展的なサンプルスクリプトです。HSP3でマウスに関連した標準の命令・関数・システム変数には、下のようなものが用意されています。

名称 説明
mouse命令 ポインタ(カーソル)の表示位置を変更。
カーソル表示・非表示の切り替え。
getkey命令 左ボタン、右ボタン、中ボタン(ホイールボタン)が
クリックされているか取得。
stick命令 左ボタン、右ボタンがクリックされているか取得。
onclick命令 左ボタン、右ボタン、中ボタン(ホイールボタン)が
クリックされた時のラベルジャンプ先を指定。
システム変数 mousex ポインタの位置(X座標、Y座標)が返る。
HSPの自ウィンドウ内(クライアントエリア、デフォルトで
白い部分)から見た位置です。
システム変数 mousey
システム変数 mousew マウスホイールの回転移動量(±120)が返る。
システム変数 ginfo_mx
ginfo関数 (タイプ0)
ポインタの位置(X座標、Y座標)が返る。
PCのモニタ画面から見た位置です。
システム変数 ginfo_my
ginfo関数 (タイプ1)

↑TOP↑

マウス操作

 HSP2にはllmod.asモジュールを利用したmouse_event命令がありました。
 これはマウスを操作する命令(クリック動作)ですが、同名のWin32 API関数であるmouse_event関数を単に呼び出していただけです。HSP3では「llmod3」にも用意されてます。

//	mouse_event関数サンプル (by Kpan)

#include "user32.as"

;	mouse_event関数
;	第1パラ ... 動作の種類指定 (以下の数値の組み合わせ)
;		$8000=絶対座標 (指定しないと直前のカーソル座標位置が移動量に反映)
;		$1=カーソル移動
;		$2=左ボタンダウン、$4=アップ (→足した$6だと左クリック)
;		$8=右ボタンダウン、$10=アップ
;		$20=中央ボタンダウン、$40=アップ
;		$800=ホイール回転 (Windows NT/2K以降)
;	第2パラ、第3パラ ... XY方向の移動量 (×ピクセル数)
;		0〜65535の範囲と決まっているので、1/2すれば画面の中心に
;	第4パラ ... ホイールの移動量
		ホイール回転を指定している場合
;	第5パラ ... 0指定

	mouse_event $8000 | $1, 65535 / 2, 65535 / 2, 0, 0

 動作を組み合わせれば、一連のクリック動作(マウスのボタンの押し下げ+ボタンから離す)になります。

//	mouse_event関数サンプル (by Kpan)

#include "user32.as"

	wait 100

;	カーソル移動
	repeat 2000
		mouse_event $8000 | $1, cnt, cnt, 0, 0
	loop

	wait 100

;	右ボタンクリック
	mouse_event $8 | $10, 0, 0, 0, 0

	mes "done"

↑TOP↑

マウスカーソルの変更

 自ウィンドウ上でのマウスカーソル(マウスポインタ)の変更です。
 まずはWindowsのシステムが用意してる15個ほどカーソル(砂時計、禁止マークなど)を利用するサンプルです。カーソルIDの一覧はちょくとさんのページを参照してください。

//	システムのカーソルを利用するコード (by Kpan)

#include "user32.as"

;	ウィンドウ全体の場合
;	LoadCursor関数の第2パラに カーソルID を指定。
	LoadCursor 0, 32514
	SetClassLong hwnd, -12, stat

;	特定オブジェクト上のみの場合
	chkbox "チェック", a
	hChkbox = objinfo(stat, 2)

	LoadCursor 0, 32649
	SetClassLong hChkbox, -12, stat

 今度は自前のカーソルを利用する方法です。LoadCursorFromFile関数でハードディスク上のカーソルファイル(*.cur)や、アニメーションカーソルファイル(*.ani)を読み込んで利用する方法です。

//	カーソルファイルの利用 (by Kpan)

#include "user32.as"

	dialog "cur;*.ani", 16, "カーソルファイル"
	if stat = 0 : stop

	LoadCursorFromFile refstr
	SetClassLong hwnd, -12, stat

 次に、実行ファイルにカーソルファイルのデータを「リソース」として埋め込んでおくHSP的にはイレギュラーな手法です。リソースエディタ「Resource Hacker」を別途用意してください。まず、実行ファイル(正確に言えば、後に実行ファイルとなるランタイム)にカーソルを埋め込む作業を行います。

  1. 「Resource Hacker」でHSP本体にある「hsprt」ファイルを読み込みます。HSP拡張ランタイムを利用する場合は、runtimeフォルダの「*.hrt」ファイルを読み込みます。
  2. [アクション]メニューの[新しいリソースを追加する]を選択し、カーソルファイル(*.cur)を選択します。[リソースの種類]には「CURSORGROUP」が自動的に入り、[リソース名]は例として「1」(この後利用する数値)を、[リソースの言語]は適当に「1033」と入力します。
  3. [ファイル]メニューの[名前を付けて保存する]で、任意のファイル名で保存してください。拡張子は「*.hrt」に形にしてください。ここでは例として「hogehoge.hrt」とします。このファイルはHSP本体以下の「runtime」フォルダに移動させてください。

 で、HSPスクリプトで任意のカーソルをリソースから読み込む処理を書きます。

//	リソースのカーソルを利用1 (by Kpan)

;	自動作成オプション指定に先ほど保存した拡張ランタイム(*.hrt)を設定
#packopt runtime "hogehoge.hrt"

#include "user32.as"

;	実行ファイル内からカーソルデータを読み込んでカーソルのハンドルを取得。
;	第2パラメータが先ほどの[リソース名]で指定した数値です。
	LoadCursor hinstance, 1

	SetClassLong hwnd, -12, stat

 これで完成。早速、[コンパイル+実行]をやってみましょう。とかろが、カーソルは何も変化しないと思います。これは実行ファイルにならないと、実際の効果を確認することはできません。必ず[実行ファイル自動作成]で実行ファイルを作成し確認してください。

 カーソルファイルは複数個埋め込むこともできます。もう1つ埋め込んで、それはオブジェクト上でカーソルが変わる処理にしてみます。「hogehoge.hrt」を「Resource Hacker」で再び読み込み、[リソース名]を今度は「2」としておきましょう。そして、上のスクリプトに以下のように追記します。

//	リソースのカーソルを利用2 (by Kpan)

#packopt runtime "hogehoge.hrt"

#include "user32.as"

;	ウィンドウ全体
	LoadCursor hinstance, 1
	SetClassLong hwnd, -12, stat

;	オブジェクト上
	chkbox "ここの上ネ", value
	hChkbox = objinfo(stat, 2)

;	カーソル読み込み
	LoadCursor hinstance, 2

;	objinfo関数の第1パラメータでオブジェクトIDを指定
	SetClassLong hChkbox, -12, stat

↑TOP↑

マウスのクリックチェック

 シングルクリックとダブルクリックの判定です。シングルクリックは標準のonclick命令でも可能です。ダブルクリックは、HSP2の場合だとちょっと大変だと思いますが、HSP3では楽に実現できます。(→ 参照、HSP開発Wiki

//	左クリックサンプルソース (by Kpan)

;	WM_LBUTTONDOWN (マウスの左クリックされた時)
	oncmd gosub *lbuttondown, $201

;	[おまけ]
;	WM_MBUTTONDOWN (マウスの中央ボタンが押された時)
	oncmd gosub *mbuttondown, $207

	stop

*lbuttondown
;	1=左ボタン、3=右ボタン+左ボタン、5=Shiftキー+左ボタン、
;	9=Ctrlキー+左ボタン
	mes "左クリック: "+wParam+""

	return

*mbuttondown
;	16=中央ボタンが押された
	mes "中央: "+wParam+""

	return
//	ダブルクリックサンプルソース (by Kpan)

#include "user32.as"

;	WM_LBUTTONDBLCLK (左ボタンをダブルクリックした時)
	oncmd gosub *lbuttondblclk, $203

;	WM_RBUTTONDBLCLK (右ボタンをダブルクリックした時)
	oncmd gosub *rbuttondblclk, $206

;	ダブルクリックを取得できるようウィンドウクラススタイル変更 (CS_DBLCLKS)
	GetClassLong hwnd, -26
	SetClassLong hwnd, -26, stat | $8

	stop

*rbuttondblclk
*lbuttondblclk
;	wparam値に1=左ボタン、2=右ボタンが返る
	dialog "ダブルクリッッーク! ("+wparam+")"

	return

↑TOP↑

マウスカーソルの移動範囲制限

 いまいち実用性が不明な代物ですが、マウスカーソルのウィンドウ移動範囲を制限します。ウィンドウを移動したりしてしまうと制限は解除されてしまいます。プログラムの終了の際は必ず制限を解除してください。

//	カーソル移動範囲制御 (by Kpan)

#include "user32.as"

;	制限する画面全体の左上XY座標、右下XY座標 (RECT構造体)
	RECT = 100, 0, 200, 200
	ClipCursor varptr(RECT)

	wait 500

;	解除するには 0 指定
	ClipCursor 0

↑TOP↑

マウスカーソルの座標取得

 マウスのポインタ(カーソル)が移動した際に通知されるウィンドウメッセージ「WM_MOUSEMOVE」をチェックします。HSPのループチェックを使わない手法です。

//	自ウィンドウの座標 (by Kpan)

;	WM_MOUSEMOVE (マウスカーソルが移動した時)
	oncmd gosub *mousemove, $200
	stop

*mousemove
;	wparam には 1=マウスの左ボタンを押しながら、2=右ボタンを
;	押しながら、4=Shiftキーを押しながら、8=Ctrlキーを押し
;	ながら、16=中央ボタンを押しながら。
	title "X: "+mousex+" / Y: "+mousey+" || "+wparam+""

	return
//	スクリーン全体の座標 (by Kpan)
//	(注) エディタの[HSP]メニュー→[HSP拡張マクロを使用する]を要有効。

	oncmd gosub *mousemove, $200
	stop

*mousemove
	title "X: "+ginfo(0)+" / Y: "+ginfo(1)+""

	return

↑TOP↑

マウスカーソルの状態取得

 mouse命令でマウスカーソル(マウスポインタ)の表示・非表示の状態を切り替えできますが、現在のカーソルの表示状態を取得します。Windows 98以降のGetCursorInfo関数(CURSORINFO構造体)を利用します。

//	カーソルの状態取得 (by Kpan)
//	Windows 98〜

#include "user32.as"

;	CURSORINFO構造体
	dim CURSORINFO, 5

	button "消す", *hidden
	button "表示", *show

	stoop

*hidden
	mouse -1
	goto *check

*show
	mouse
	goto *check

*check
	CURSORINFO = 20
	GetCursorInfo varptr(CURSORINFO) 

;	0=表示なし、1=表示あり
	title ""+CURSORINFO.1

 また、mouse命令のヘルプにあるように、『マウスカーソル表示の設定は、システムの内部カウンタにより制御されています。OFFにした表示を、再度表示するためには、OFFにした回数分だけ表示のリクエストを行なう必要があるので注意してください』とあります。ShowCursor関数を利用すると、戻り値がこの「システムの内部カウンタ」値です。

//	カーソルの表示・非表示 (by Kpan)

#include "user32.as"

	repeat 5
;		0で非表示カウントアップ、1で表示カウントアップ
		ShowCursor 0
	loop
	mes stat

↑TOP↑

マウスホイールの移動量取得

 ホイール回転時に通知されるウィンドウメッセージ「WM_MOUSEWHEEL」です。前回転で120の倍数値、後回転で-120の倍数値が返ります。ちなみに、HSP3にはシステム変数mousewも用意されてます。

//	ホイール移動量の取得
//	Windows 98〜

;	WM_MOUSEWHEEL (ホイールが回転した時)
	oncmd gosub *mousewheel, $20A

	stop

*mousewheel
;	wparamの上位ワードに移動量が返る
	mes ""+(wparam >> 16 & $FFFF)

	return

↑TOP↑

タイトルバーのクリック判定

;	WM_NCLBUTTONDOWN (タイトルバーがクリックされた時)
	oncmd gosub *nclbuttondown, $A1

;	WM_NCLBUTTONDBLCLK (タイトルバーがダブルクリックされた時)
	oncmd gosub *nclbuttondblclk, $A3

	stop

*nclbuttondown
	mes "クリック"
	return

**nclbuttondblclk
	mes "ダブルクリック"
	return

↑TOP↑

〜HSP3 あれこれ〜
ウィンドウ | オブジェクト | ファイル | フォルダ | キーボード | マウス | メニュー | システム | 文字列 | COM | その他

Copyright © 2005-2012 . All rights reserved.