〜 ウィンドウ 〜
カーソルキー操作でウィンドウサイズ変更

Windowsでは、 メッセージのやり取りにより各種コントロールなどのオブジェクトを制御しており、
ウィンドウもまた、メッセージを渡して処理を行わせ、何らかのイベントを起こすとメッセージを返します。
HSPで作成したと言えど、生成されたウィンドウは上記の対象となっているので、
送信Win32メッセージに「WM_SYSCOMMAND(=0x0112)」、送信パラメータに「SC_SIZE(=0xF000)」で、
カーソルキーで指定した方向と逆サイドからカーソルキー方向にウィンドウを縮めることができます。
メッセージのやり取りを行うには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, 0xF000, 不使用変数(=0), 0」
HSP3「sendmsg hwnd, 0x0112, 0xF000, 不使用(=0)

winstretch 方向, 左端, 上端, 右端, 下端
方向伸縮する面(1:左 2:上 4:右 8:下)を指定する。
左端ドラッグ&ドロップ許可範囲左端座標を指定する。
上端ドラッグ&ドロップ許可範囲上端座標を指定する。
右端ドラッグ&ドロップ許可範囲右端座標を指定する。
下端ドラッグ&ドロップ許可範囲下端座標を指定する。

 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
28
29
#module
#deffunc winstretch int, int, int, int, int
	mref dir, 0 : mref left, 1 : mref top, 2 : mref right, 3 : mref bottom, 4
	i = mousex, mousey
	if i >= left & (i <= right) & (i.1 >= top) & (i.1 <= bottom) {
		if dir < 0 : i = 0XF000 : else : if dir > 8 : i = 0xF008 : else : i = 0xF000 + dir
		objsend -28, 0x0112, i, nonuse
	}
	return
#global

	screen 2, dispx, dispy, , , , 400, 400
	title "色付きエリア内、または外枠のみ伸縮処理可能"
	r = 10, 10, winx - 10, winy - 10
	color 240, 240, 240
	boxf r.0, r.1, r.2, r.3
	color 255
	line  50,  50, 350, 350
	line  50,  50,  50, 100 : line  50,  50, 100,  50
	line 350, 350, 300, 350 : line 350, 350, 350, 300
	color , , 255
	pos  20,  20 : mes "縮める"
	pos 340, 360 : mes "伸ばす"
	repeat
		wait 1
		stick key, , 1
		if key & 256 = 0 : continue
		winstretch 8, r.0, r.1, r.2, r.3
	loop

winstretch 方向, 左端, 上端, 右端, 下端
方向伸縮する面(1:左 2:上 4:右 8:下)を指定する。
左端ドラッグ&ドロップ許可範囲左端座標を指定する。
上端ドラッグ&ドロップ許可範囲上端座標を指定する。
右端ドラッグ&ドロップ許可範囲右端座標を指定する。
下端ドラッグ&ドロップ許可範囲下端座標を指定する。

 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
#module
#deffunc winstretch int dir, int left, int top, int right, int bottom, local i
	i = mousex, mousey
	if i >= left & i <= right & i.1 >= top & i.1 <= bottom {
		sendmsg hwnd, 0x0112, 0xF000 + limit(dir, 0, 8)
	}
	return
#global

	screen 0, ginfo_dispx, ginfo_dispy, , , , 400, 400
	title "色付きエリア内、または外枠のみ伸縮処理可能"
	r = 10, 10, ginfo_winx - 10, ginfo_winy - 10
	color 240, 240, 240
	boxf r.0, r.1, r.2, r.3
	color 255
	line  50,  50, 350, 350
	line  50,  50,  50, 100 : line  50,  50, 100,  50
	line 350, 350, 300, 350 : line 350, 350, 350, 300
	color , , 255
	pos  20,  20 : mes "縮める"
	pos 340, 360 : mes "伸ばす"
	repeat
		wait 1
		stick key, , 1
		if (key & 256) = 0 : continue
		winstretch 8, r.0, r.1, r.2, r.3
	loop