HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0119
morino384枠なしウィンドウサイズの変更3未解決


morino384

リンク

2015/1/19(Mon) 17:29:09|NO.66999

枠なしウィンドウのサイズが、枠なしウィンドウの片隅で
変えられるようなことってできますか?

できれば、ウィンドウサイズによって、アプリケーション内のレイアウトが
変わるようにしたいのですが...

ご教授ください。



この記事に返信する


774

リンク

2015/1/21(Wed) 21:12:54|NO.67033

マウスカーソルの位置・ボタン状態をループ監視といった手法でも出来なくないですが
常時フル稼働っぽいのでお勧めしません。

onCmdによるメッセージと、SetCapture/ReleaseCapture APIを使った方法を挙げてみます。
(勿論他にもやり方はあると思います、あくまで一例です)


0.まず注意点ですが、HSPウィンドウのサイズは作成時のサイズより大きくできません。
 予め取り得る最大サイズで作成しておく必要があります。
  BgScr 1,1920,1200,0,-1,-1, 640,480 ;第7,8引数で初期表示サイズを指定します

1.WM_LButtonDown をonCmdで捕捉 [サイズ変更開始]
 ・マウスカーソルの位置がサイズ変更用の場所かを確認し、違えば処理を抜けます(Return)
 ・「サイズ変更中」フラグをONにします
 ・マウスカーソルのスクリーン座標位置を変数に格納します
 ・現在のウィンドウ位置・サイズを変数に格納します
 ・SetCapture を使用しマウスイベントをアクティブなHSPウィンドウで専有します

2.WM_MouseMove をonCmdで捕捉 [サイズ変更中]
 ・「サイズ変更中」フラグがOFFなら何もしません(さっさとReturnで戻ります)
 ・1で格納した変更開始時のカーソル位置と現在のカーソル位置の相対値を元に
  現在のウィンドウ位置・サイズを求めて適用します

3.WM_LButtonUp をonCmdで捕捉 [サイズ変更終了]
 ・「サイズ変更中」フラグがOFFならReturnで抜けてしまっても良いです
 ・「サイズ変更中」フラグがONならOFFに変更します
 ・ReleaseCapture を使用し、マウスイベントの専有を解除します
 ※この時のウィンドウサイズが変更後のウィンドウサイズとなります


内部レイアウト変更は2.で行う事も可能ですが、動作が重くなりそうですので
3.のサイズ確定後に行った方が宜しいかも知れません。

サイズ変更開始場所による変更方向制限や、変更中のマウスカーソル変更も組み込めば
ほぼ標準のサイズ変更と同様のものができると思います。



774

リンク

2015/1/21(Wed) 21:26:21|NO.67034

追記です。

内部レイアウト変更は SetWindowPos APIを使えば行えます。
ObjInfo_hWnd で取得したオブジェクトのハンドルをhWndとして渡してあげます。



掘木

リンク

2015/1/21(Wed) 22:13:20|NO.67038

サイズ変更時にはWM_SIZE(0x0005)が来るはずなので、
その際にレイアウト変更処理をすればどうでしょう。

端をドラッグしてサイズ変更するには、
WM_NCHITTESTメッセージの返り値を弄ればそれっぽく動くような気がします。
その際の定数はMSDNあたりから漁ってください(多分英語しかないけど)

#define WM_SIZE 0x0005 #define WM_NCHITTEST 0x0084 #define HTLEFT 10 #define HTRIGHT 11 #define HTTOP 12 #define HTTOPLEFT 13 #define HTTOPRIGHT 14 #define HTBOTTOM 15 #define HTBOTTOMLEFT 16 #define HTBOTTOMRIGHT 17 #define HTNOWHERE 0 #define HTCLIENT 1 #define HTCAPTION 2 bgscr 0,480,320 cls 4 pos 240,160 button "Quit",*quit oncmd gosub *onNCHITTEST,WM_NCHITTEST oncmd gosub *onSIZE,WM_SIZE gosub *onSIZE stop *onNCHITTEST // lparamにはマウス座標(スクリーン座標)が入る。 mouseposy = ( lparam >> 16) mouseposx = ( lparam << 16 ) >> 16 if ( mouseposx < ginfo_wx1 ): return HTNOWHERE if ( mouseposx >= ginfo_wx2 ): return HTNOWHERE if ( mouseposy < ginfo_wy1 ): return HTNOWHERE if ( mouseposy >= ginfo_wy2 ): return HTNOWHERE xblock = (mouseposx-ginfo_wx1)*5/(ginfo_wx2-ginfo_wx1) yblock = (mouseposy-ginfo_wy1)*5/(ginfo_wy2-ginfo_wy1) if ( xblock == 0 && yblock == 0 ) : return HTTOPLEFT if ( xblock == 0 && yblock == 4 ) : return HTBOTTOMLEFT if ( xblock == 4 && yblock == 0 ) : return HTTOPRIGHT if ( xblock == 4 && yblock == 4 ) : return HTBOTTOMRIGHT if ( xblock == 0 ) : return HTLEFT if ( xblock == 4 ) : return HTRIGHT if ( yblock == 0 ) : return HTTOP if ( yblock == 4 ) : return HTBOTTOM return HTCLIENT *onSIZE redraw 0 color 48,48,192 boxf color 255,255,255 xp1 = (ginfo_wx2-ginfo_wx1)/5 xp2 = (ginfo_wx2-ginfo_wx1)*4/5-1 yp1 = (ginfo_wy2-ginfo_wy1)/5 yp2 = (ginfo_wy2-ginfo_wy1)*4/5-1 boxf xp1,yp1,xp2,yp2 pos xp1,yp1 color mes strf("size(%d,%d)",(ginfo_wx2-ginfo_wx1),(ginfo_wy2-ginfo_wy1)) redraw 1 return *quit end

補足:コードに誤りがあったので削除し、修正。



ONION software Copyright 1997-2023(c) All rights reserved.