hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
bgscrで作ったキャプション無しウィンドウをマウスで動かしたり、描画しながらマウスでウィンドウを動かしたり・・・についてのページです。
+ | v3_046_MoveWnd_bta.hsp |
v3_046_MoveWnd_bta.hsp
|
このサンプルでは右クリックでマウスメッセージによるウィンドウの移動をしていますが、ドラッグ中にカーソルが最前面ウィンドウの上にある時移動されません。
これは最善面ウィンドウが WM_MOUSEMOVE を受け取っているからです。
このままウィンドウ(2)にカーソルがもどると再び移動をします。
またこの時、最前面ウィンドウを経由して他のアプリケーションウィンドウにカーソルが乗ると WM_MOUSEMOVE はそのウィンドウに送られます。
このサンプルでマウスカーソルがウィンドウ(2)以外に乗っているときに右クリックをやめて再びウィンドウ(2)にカーソルを載せると右クリックをしていないのにウィンドウが追ってきます。
これは WM_RBUTTONUP を受け取っていないからです。
多くのマウスメッセージはカーソルの下にあるウィンドウに送られるからです。
また右クリックした後、激しくドラッグしてみてください。
ウィンドウがカーソルについていけずに振り切られてしまいます。
これは WM_MOUSEMOVE が発行されてからウィンドウをズラした際に、既にカーソルは WM_MOUSEMOVE が発行された座標から大きく動いているためです。
振り切ったカーソルはそれ以降、カーソルの下にあるウィンドウにマウスメッセージを送りますから結果としてウィンドウが振り切られてしまうことになります。
そういった時の解決策としてはマウスボタン押下の際にマウスをキャプチャするなどが考えられます。
マウスキャプチャとはマウスカーソルが他のウィンドウ上にあってもマウスメッセージをキャプチャしているウィンドウに送るようにするというものです。
上のスクリプトにマウスキャプチャを設定するコードを付け加えるだけです。
WM_RBUTTONDOWN で SetCapture?()関数を使ってマウスキャプチャを開始させます。
SetCapture?()にはマウスをキャプチャするウィンドウのハンドルを指定します。
WM_RBUTTONUP で ReleaseCapture?()関数を使ってマウスキャプチャを解除します。
ReleaseCapture?()は引数無しです。