〜 ウィンドウ 〜
カーソルキー操作でウィンドウ移動

Windowsではメッセージのやり取りにより各種コントロールなどのオブジェクトを制御しており、
ウィンドウもまた、メッセージを渡して処理を行わせ、何らかのイベントを起こすとメッセージを返します。
HSPで作成したと言えど、生成されたウィンドウは上記の対象となっているので、
例えば、送信Win32メッセージに「WM_SYSCOMMAND(=0x0112)」を、
送信パラメータに「SC_MOVE(=0xF010)」を指定すれば、ドラッグ中はカーソルキーで位置を変更できます。
メッセージのやり取りを行うにはobjsend命令(HSP2)、sendmsg命令(HSP3)を使用し、
メッセージの送り先は自ウィンドウとします。HSP3ではシステム変数から簡単に取得できますが、
HSP2ではBMSCR構造体からしか取得ができませんし、
何より、objsend命令はHSP3のsendmsg命令と同じ内容であるものの、
メッセージの送信先対象がコントロール(HSPでのオブジェクト)に限定されており、
パラメータに指定するのは1つ目のオブジェクトを0としたオブジェクトIDとなっています。
コレは表向きなもので、実はオブジェクトIDを指すというより、
BMSCR構造体の要素41(hCld)からの要素番号を指しているので、
ウィンドウハンドルが保持されている要素13(hwnd)を指せば、ウィンドウを指定したことになるのです。
HSP2「objsend 13 - 41, 0x0112, 0xF010, 不使用変数(=0), 0」
HSP3「sendmsg hwnd, 0x0112, 0xF010, 不使用(=0)」
上記はカーソルキー指定によるウィンドウ位置の変更方法ですが、
コチラにウィンドウ内ドラッグで移動する方法を書いています。併せてご覧ください。
	
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
	screen 0, dispx, dispy
	width 400, 400
	r = 20, 20, 380, 380
	color 240, 240, 240 : boxf r.0, r.1, r.2, r.3 : color
	pos 20, 20
	mes "1.色付きエリアを押し続けます"
	mes "2.マウスカーソルが中央に移動します"
	mes "3.カーソルキーを押すと指定方向端に移動します"
	mes "4.そのまま押し続けるサイズ変更ができます"
	repeat
		wait 1
		stick key, 256, 1
		if key & 256 {
			p = mousex, mousey
			if mousex >= r.0 & (mousey >= r.1) & (mousex <= r.2) & (mousey <= r.3) {
			  objsend -28, 0x0112, 0xF000, nonuse
			}
		}
	loop
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
	screen 0, ginfo_dispx, ginfo_dispy, , , , 400, 400
	r = 20, 20, 380, 380
	color 240, 240, 240 : boxf r.0, r.1, r.2, r.3 : color
	pos 20, 20
	mes "1.色付きエリアを押し続けます"
	mes "2.マウスカーソルが中央に移動します"
	mes "3.カーソルキーを押すと指定方向端に移動します"
	mes "4.そのまま押し続けるサイズ変更ができます"
	repeat
		wait 1
		stick key, 256, 1
		if key & 256 {
			p = mousex, mousey
			if mousex >= r.0 & mousey >= r.1 & mousex <= r.2 & mousey <= r.3 {
			  sendmsg hwnd, 0x0112, 0xF000
			}
		}
	loop