〜 ウィンドウ 〜
タイトルバー以外を掴んで移動

Windowsでは、メッセージのやり取りにより各種コントロールなどのオブジェクトを制御しており、
ウィンドウもまた、メッセージを渡して処理を行わせ、何らかのイベントを起こすとメッセージを返します。
コチラで書いているように送信Win32メッセージに「WM_SYSCOMMAND(=0x0112)」を、
送信パラメータに「SC_MOVE(=0xF010)」を指定すれば、カーソルキーで移動できますが、
ウィンドウサイズ変更のカーソルキー版マウスによるドラッグ版の関係のように、
ウィンドウ移動でも別途紹介したカーソルキー版と今回紹介するマウスによる移動版の2タイプあります。
設定値の関係もウィンドウサイズのカーソルキー・マウス変更と類似しており、
SC_MOVEを元に0xF011〜0xF01Fまでがマウスによる変更となっているようです。
メッセージのやり取りはobjsend命令(HSP2)、sendmsg命令(HSP3)を使用します。
基本的な設定の仕方についてはコチラに書いていますので参考し、
送信すべきパラメータに前述の0xF011〜0xF01Fのいずれかを指定すればOKです。
HSP2「objsend 13 - 41, 0x0112, 0xF011, 不使用変数(=0), 0」
HSP3「sendmsg hwnd, 0x0112, 0xF011, 不使用(=0)

winddmove 左端, 上端, 右端, 下端
左端ドラッグ&ドロップ許可範囲左端座標を指定する。
上端ドラッグ&ドロップ許可範囲上端座標を指定する。
右端ドラッグ&ドロップ許可範囲右端座標を指定する。
下端ドラッグ&ドロップ許可範囲下端座標を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#module
#deffunc winddmove int, int, int, int
	mref left, 0 : mref top, 1 : mref right, 2 : mref bottom, 3
	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, 0xF011, nonuse
	}
	return
#global

	screen 0, 400, 400
	r = 20, 20, 380, 380
	color 240, 240, 240 : boxf r.0, r.1, r.2, r.3 : color
	pos r.0 + 10, r.1 + 10 : mes "色付きエリア内をドラッグしてください"
	repeat
		wait 1
		stick key, , 1
		if key & 256 = 0 : continue
		winddmove r.0, r.1, r.2, r.3
	loop

winddmove 左端, 上端, 右端, 下端
左端ドラッグ&ドロップ許可範囲左端座標を指定する。
上端ドラッグ&ドロップ許可範囲上端座標を指定する。
右端ドラッグ&ドロップ許可範囲右端座標を指定する。
下端ドラッグ&ドロップ許可範囲下端座標を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#module
#deffunc winddmove 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, 0xF011
	}
	return
#global

	screen 0, 400, 400
	r = 20, 20, 380, 380
	color 240, 240, 240 : boxf r.0, r.1, r.2, r.3 : color
	pos r.0 + 10, r.1 + 10 : mes "色付きエリア内をドラッグしてください"
	repeat
		wait 1
		stick key, , 1
		if (key & 256) = 0 : continue
		winddmove r.0, r.1, r.2, r.3
	loop