hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
ウィンドウの移動 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ

hsp3.png

ウィンドウの移動

bgscrで作ったキャプション無しウィンドウをマウスで動かしたり、描画しながらマウスでウィンドウを動かしたり・・・についてのページです。

常套手段

  • ヒットテストを処理してキャプションが押されたことにする
  • 移動フラグを用いる
    1. WM_LBUTTONDOWNなどのマウスボタンの押下メッセージで移動フラグを立てる
    2. WM_MOUSEMOVEなどのマウスの移動メッセージで移動フラグが立っていたらウィンドウを動かす
    3. WM_LBUTTONUPなどのマウスボタンの離すメッセージで移動フラグを降ろす
+  filev3_046_MoveWnd_bta.hsp

このサンプルでは右クリックでマウスメッセージによるウィンドウの移動をしていますが、ドラッグ中にカーソルが最前面ウィンドウの上にある時移動されません。
これは最善面ウィンドウが WM_MOUSEMOVE を受け取っているからです。
このままウィンドウ(2)にカーソルがもどると再び移動をします。
またこの時、最前面ウィンドウを経由して他のアプリケーションウィンドウにカーソルが乗ると WM_MOUSEMOVE はそのウィンドウに送られます。

このサンプルでマウスカーソルがウィンドウ(2)以外に乗っているときに右クリックをやめて再びウィンドウ(2)にカーソルを載せると右クリックをしていないのにウィンドウが追ってきます。
これは WM_RBUTTONUP を受け取っていないからです。
多くのマウスメッセージはカーソルの下にあるウィンドウに送られるからです。

また右クリックした後、激しくドラッグしてみてください。
ウィンドウがカーソルについていけずに振り切られてしまいます。
これは WM_MOUSEMOVE が発行されてからウィンドウをズラした際に、既にカーソルは WM_MOUSEMOVE が発行された座標から大きく動いているためです。
振り切ったカーソルはそれ以降、カーソルの下にあるウィンドウにマウスメッセージを送りますから結果としてウィンドウが振り切られてしまうことになります。

常套手段の落とし穴と解決策

  • ヒットテストでキャプションバーの押下を処理した場合、クライアント領域の描画が更新されません。
  • 移動フラグを用いてマウスメッセージを処理した場合、マウスメッセージであるが故の問題点が起こります。
    マウスメッセージはマウスのすぐ下にあるウィンドウにメッセージが送られるため、移動フラグを立てて移動中の時にマウスが最前面ウィンドウなどを横切ろうとするとWM_MOUSEMOVEは自分(のプログラム)には送られず最前面ウィンドウに送られます。
    そのまま最前面ウィンドウを横切って自分のクライアント領域にマウスが乗ると再び自分のところにWM_MOUSEMOVEが送られてきます。
    この時、最前面ウィンドウ上でボタンを離したりすると最前面ウィンドウにWM_LBUTTONUPが送られて、自分には送られてきません。
    このままマウスボタンを離したまま自分のところにマウスがもどってきた場合、本来WM_LBUTTONUPで移動フラグを降ろすべきところを処理できなかったのでボタンを離したままでもウィンドウがマウスにくっついてきてしまうという事態が起こります。

    そういった時の解決策としてはマウスボタン押下の際にマウスをキャプチャするなどが考えられます。
    マウスキャプチャとはマウスカーソルが他のウィンドウ上にあってもマウスメッセージをキャプチャしているウィンドウに送るようにするというものです。

上のスクリプトにマウスキャプチャを設定するコードを付け加えるだけです。

WM_RBUTTONDOWN で SetCapture?()関数を使ってマウスキャプチャを開始させます。
SetCapture?()にはマウスをキャプチャするウィンドウのハンドルを指定します。

WM_RBUTTONUP で ReleaseCapture?()関数を使ってマウスキャプチャを解除します。
ReleaseCapture?()は引数無しです。

コメント

  • とりあえず箇条書きで・・。 -- kz3 2006-01-27 (金) 15:34:43
  • 僕はgetkeyとwidthで実現してしまいました。後でぷまさんのHPでいい方法みつけました。(^^;) -- hiroki? 2006-01-27 (金) 16:09:55
  • まだぷまさんのサンプルは未完成のようです、なんて私がいえる立場ではないですが・・・ver0.91でも上記〜DOWN、MOVE、〜UPの組み合わせで処理しているので最前面問題などがあったりです。恐らくこの後キャプチャを入れてくると私は予想しますが、はたしてどう打って出るか・・・ちょっと楽しみです。(こういうの陰口って言ったり? -- kz3 2006-01-27 (金) 16:40:16

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
filev3_046_MoveWnd_bta.hsp
590件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:38:47 (2436d)