〜 インプット 〜
マウスカーソルを変更 (要USER32.DLL)

予め設定されているマウスポインタの形状を任意のカーソル画像に変更するサンプルです。
カーソルをファイルから指定するにはAPI関数LoadCursorFromFileを使い、
引数に「カーソルファイルのパスを格納した変数のポインタ」を指定すれば準備完了。
もし、引数であるポインタの上位ワードが0の場合は下位ワードをカーソル識別子として判断し、
win.iniファイルの[cursors]セクションのシステムカーソルを検索するようになっています。
定数コードカーソル名備考
16進10進
OCR_NORMAL0x7F0032512Arrow標準の矢印カーソル
OCR_IBEAM0x7F0132513IBeamアイビームカーソル
OCR_WAIT0x7F0232514Wait砂時計カーソル
OCR_CROSS0x7F0332515Crosshair十字カーソル
OCR_UP0x7F0432516UpArrow上を指す垂直の矢印カーソル
OCR_SIZE0x7F8032640現在は使われていない(OCR_SIZEALLを使用)
OCR_ICON0x7F8132641現在は使われていない(OCR_NORMALを使用)
OCR_SIZENWSE0x7F8232642SizeNWSE左上と右下を指す両方向矢印カーソル
OCR_SIZENESW0x7F8332643SizeNESW右上と左下を指す両方向矢印カーソル
OCR_SIZEWE0x7F8432644SizeWE左右を指す両方向矢印カーソル
OCR_SIZENS0x7F8532645SizeNS上下を指す両方向矢印カーソル
OCR_SIZEALL0x7F8632646SizeAll4方向の矢印カーソル
OCR_ICOCUR0x7F8732647現在は使われていない(OIC_WINLOGOを使用)
OCR_NO0x7F8832648No禁止カーソル
OCR_HAND0x7F8932649Hand手カーソル
OCR_APPSTARTING0x7F8A32650AppStarting標準の矢印と小さい砂時計カーソル
無事にロードできれば識別番号となるハンドルが戻り値として受け取るようになっており、 既に使用しているカーソルを再指定した場合、新たなハンドルではなく既存のハンドルを受け取ります。 つまり、重複指定しても問題ないもので共有カーソルとして扱われる為、 1回使ったからといって使用後にカーソルリソースを解放してしまうとどこで問題が起こるかもわかりません。 使い終わってもカーソルを解放するAPI関数DestroyCursor等は呼び出さないようにしてください。 ロードしたカーソルをウィンドウやオブジェクトに結び付けるにはAPI関数SetClassLongを使います。 API関数SetClassLongの第1引数から順に「ウィンドウハンドル」「属性番号」「設定値」。 属性番号は以下から変更対象の属性を指定してください。
GCL_HICONSM0xFFFFFFDE関連付けられる小さいアイコンのハンドルを書換
GCL_STYLE0xFFFFFFE6スタイル書換
GCL_WNDPROC0xFFFFFFE8ウィンドウプロシージャのアドレス書換
GCL_CBCLSEXTRA0xFFFFFFEC拡張クラスメモリのサイズをバイト単位で設定
GCL_CBWNDEXTRA0xFFFFFFEE拡張ウィンドウメモリのサイズをバイト単位で設定
GCL_HMODULE0xFFFFFFF0登録したモジュールのハンドル書換
GCL_HICON0xFFFFFFF2関連付けられるアイコンのハンドル書換
GCL_HCURSOR0xFFFFFFF4関連付けられるマウスカーソルのハンドル書換
GCL_HBRBACKGROUND0xFFFFFFF6関連付けられる背景ブラシのハンドル書換
GCL_MENUNAME0xFFFFFFF8関連付けられるメニュー名文字列のアドレスまたはメニューID書換
拡張子が「*.cur」や「*.ani」となったカーソルファイルを指定するもので、 HSPウィンドウ内だけでなく、配置したオブジェクト上でも別途指定できるモジュール命令にしました。 具体的な使い方は下記のサンプルを参照してください。

setcur ファイルパス
ファイルパス変更後のカーソルファイルのパスを指定する。
IDカーソルと関連付けるオブジェクトIDを指定する。
尚、−1を指定するとオブジェクトではなくウィンドウ全体が対象となる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
	ll_libload user, "user32.dll"
	ll_getproc LoadCursorFromFile, "LoadCursorFromFileA", user
	ll_getproc SetClassLong, "SetClassLongA", user

#module
#deffunc setcur str, int
	mref name, 32 : mref objid, 1
	mref bmscr, 67
	ll_getptr name : ll_ret prm
	ll_callfunc prm, 1, LoadCursorFromFile@ : ll_ret prm.2
	if objid = -1 : prm = bmscr.13 : else : prm = objid + 41 : prm = bmscr.prm
	prm.1 = 0xFFFFFFF4
	ll_callfunc prm, 3, SetClassLong@
	return stat
#global

	buf = "ボックスはコイン"
	objsize 120, 25
	pos  10, 10 : mes "ウィンドウはバナナ"
	pos 300, 40 : button "ボタンは手", *exit
	pos  50, 90 : mesbox buf, 200, 100
	setcur "C:/WINDOWS/Cursors/banana.ani", -1	// ウィンドウ全体
	setcur "C:/WINDOWS/Cursors/hand.ani", 0		// ボタン(オブジェクトID0)
	setcur "C:/WINDOWS/Cursors/coin.ani", 1		// メッセージボックス(オブジェクトID1)
	stop

*exit

setcur ファイルパス
ファイルパス変更後のカーソルファイルのパスを指定する。
IDカーソルと関連付けるオブジェクトIDを指定する。
尚、−1を指定するとオブジェクトではなくウィンドウ全体が対象となる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#uselib "user32.dll"
#cfunc	global LoadCursorFromFile "LoadCursorFromFileA" str
#func	global SetClassLong "SetClassLongA" int, int, int

#module
#deffunc setcur str name, int objid, local i
	if objid = -1 : i = hwnd : else : i = objinfo(objid, 2)
	SetClassLong i, 0xFFFFFFF4, LoadCursorFromFile(name)
	return stat
#global

	buf = "ボックスはコイン"
	objsize 100, 25
	pos  10, 10 : mes "ウィンドウはバナナ"
	pos 300, 40 : button gosub "ボタンは手", *exit
	pos  50, 90 : mesbox buf, 200, 100
	setcur "C:/WINDOWS/Cursors/banana.ani", -1	// ウィンドウ全体
	setcur "C:/WINDOWS/Cursors/hand.ani", 0		// ボタン(オブジェクトID0)
	setcur "C:/WINDOWS/Cursors/coin.ani", 1		// メッセージボックス(オブジェクトID1)
	stop

*exit
	end