ウィンドウの座標を監視して、変化があったら即「くっつけ」る方法があります。
こんな感じです。
; ※今回は分かりやすくするために配列変数を用いませんでしたが、
; 実戦では配列変数とかうまく使って汎用化すべきです。(特に条件設定の辺り)
; (ウィンドウが2枚以上になっても対応できるようにする為に。)
*INIT
;< ウィンドウメッセージ定数 >
#define WM_MOVE 3
;< WinAPI >
#uselib "user32.dll"
#func MoveWindow "MoveWindow" int ,int,int ,int,int ,int
#cfunc GetSystemMetrics "GetSystemMetrics" int
#define SM_CYCAPTION $00000004
#define SM_CXFIXEDFRAME $00000007
#define SM_CYFIXEDFRAME $00000008
;< 環境情報取得 >
height_caption = GetSystemMetrics(SM_CYCAPTION) ;タイトルバーの高さ
width_vframe = GetSystemMetrics(SM_CXFIXEDFRAME) ;垂直枠の幅
height_hframe = GetSystemMetrics(SM_CYFIXEDFRAME) ;水平枠の幅
;< 条件設定 >
;ウィンドウ1の大きさ
#define sizex_window1 400
#define sizey_window1 200
;ウィンドウ2の大きさ
#define sizex_window2 300
#define sizey_window2 100
;ウィンドウ2の同1に対する希望相対座標 (好みにカスタマイズしよう)
#define x_RelativeCoordinate_2to1 0
y_RelativeCoordinate_2to1 = sizey_window1 + height_caption+height_hframe
*SETUP
;window1
screen 0,sizex_window1,sizey_window1
color 0,128,192 : boxf
font msgothic,50,1+2+16
color 255,255,255
pos 10,10 : mes "window 1"
redraw ;(∵イタリック体の欠け防止)
hwnd_window1 = hwnd ;ウィンドウハンドルを取得しておく。(後で使う)
oncmd gosub *FOLLOW ,WM_MOVE ;「WM_MOVE」(=3) を受け取ったら *FOLLOW へサブルーチンジャンプ
;window2
screen 1,sizex_window2,sizey_window2
color 255,128,64 : boxf
font msgothic,50,1+2+16
color 255,255,255
pos 10,10 : mes "window 2"
redraw
hwnd_window2 = hwnd
oncmd gosub *FOLLOW ,WM_MOVE
gosub *FOLLOW ;最初の1回
*MAIN_1
stop
*FOLLOW
;ウィンドウの位置を取得
gsel 0 : pos_window1 = ginfo_wx1 ,ginfo_wy1
gsel 1 : pos_window2 = ginfo_wx1 ,ginfo_wy1
if (pos_window2(0) ! pos_window1(0) + x_RelativeCoordinate_2to1)|(pos_window2(1) ! pos_window1(1) + y_RelativeCoordinate_2to1) {
k = ginfo_act
if k = 0 {
;gsel 1
;width , ,pos_window1(0) + x_RelativeCoordinate_2to1 ,pos_window1(1) + y_RelativeCoordinate_2to1
;↑「width」命令ではマイナスの座標を渡すと無視されてしまうので、代わりにWinAPIの「MoveWindow」関数を使うことにします。(書式はMSDNで調べる)
MoveWindow hwnd_window2 ,pos_window1(0) + x_RelativeCoordinate_2to1 ,pos_window1(1) + y_RelativeCoordinate_2to1 ,sizex_window2+width_vframe*2 ,sizey_window2+height_caption+height_hframe ,1 ;HSPのwidth命令と違って、ウィンドウのサイズ指定ではwindowsが勝手に付ける装飾も考慮する必要がある。
}
if k = 1 {
;gsel 0
;width , ,pos_window2(0) - x_RelativeCoordinate_2to1 ,pos_window2(1) - y_RelativeCoordinate_2to1
MoveWindow hwnd_window1 ,pos_window2(0) - x_RelativeCoordinate_2to1 ,pos_window2(1) - y_RelativeCoordinate_2to1 ,sizex_window1+width_vframe*2,sizey_window1+height_caption+height_hframe ,1
}
;if k = …… { ;(ウィンドウが複数ある場合は...)
;}
}
return