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

小ワザ

[hsp3]

ウィンドウ外やオブジェクト上のマウス座標を取得

ウィンドウ外やオブジェクト上ではmousex,mouseyの値が更新されず正確な値ではなくなってしまいます。
これはマウスカーソルがクライアントエリア上にあるときにのみmousexとmouseyが更新されることによります。

ginfoを使った方法

このモジュールは上記の問題を解消し、どこであってもマウス座標が取得できるようにするモジュールのサンプルです。
gselで選んだ描画先ウィンドウから見たマウス座標を返します。

スクリプト

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#module
#deffunc rm_init
    WakuSize = (ginfo(10) - ginfo(12)) / 2        // ウィンドウ枠の幅
    TBarSize = ginfo(11) - ginfo(13) - WakuSize   // タイトルバーの幅
    return
 
#defcfunc rmousex
    return ginfo(0) - ginfo(4) - WakuSize
 
#defcfunc rmousey
    return ginfo(1) - ginfo(5) - TBarSize
 
#global
 
    screen 0, 480, 320
    rm_init                     // タイトルバーとウィンドウの枠の幅を測定
    message = {"青ラインがデフォルトのmousex&mousey、
橙ラインが自前のrmousex&rmousey。
 
橙ラインはウィンドウ外やオブジェクト上でも正確にマウスを追いかけます。"}
    pos 60,60
    mesbox message, 300, 100
 
*main
    wait 2
    redraw 0
    color 255, 255, 255 : boxf  // 画面を消去
 
    color 0, 0, 255             // mousex&mousey(青)
    line mousex, ginfo_winy, mousex, 0
    line ginfo_winx, mousey, 0, mousey
 
    color 255, 128, 0           // rmousex&rmousey(橙)
    line rmousex(), ginfo_winy, rmousex(), 0
    line ginfo_winx, rmousey(), 0, rmousey()
 
    redraw 1
    goto *main

WinAPIを使った方法

スクリーン座標をクライアント領域座標へ変換することで上記の問題を解決します。

ScreenToClient?
このAPI関数は、スクリーン上の任意の点の座標を、ウィンドウのクライアント座標に変換します。
詳しい説明:ちょくとのページ - ScreenToClient

ちなみにサンプルでは、

#func ScreenToClient "ScreenToClient" int, int

としているため、

ScreenToClient hwnd, varptr(mxy)

として使用しますが、

#func ScreenToClient "ScreenToClient" int, var

とすれば、

ScreenToClient hwnd, mxy

と簡単に記述できます。

スクリプト

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 
 
 
 
-
|
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
#uselib "user32.dll"
#func ScreenToClient "ScreenToClient" int, int
;#include "user32.as"	;user32.asを使用するときは上2行をコメントアウト。
 
    screen 0, 480, 320
    message = {"青ラインがデフォルトのmousex&mousey、
橙ラインが自前のrmousex&rmousey。
 
橙ラインはウィンドウ外やオブジェクト上でも正確にマウスを追いかけます。"}
    pos 60,60
    mesbox message, 300, 100
 
*main
    wait 2
    redraw 0
    color 255, 255, 255 : boxf  // 画面を消去
 
    color 0, 0, 255             // mousex&mousey(青)
    line mousex, ginfo_winy, mousex, 0
    line ginfo_winx, mousey, 0, mousey
 
    color 255, 128, 0           // rmousex&rmousey(橙)
    mxy = ginfo_mx, ginfo_my
    ScreenToClient hwnd, varptr(mxy)
 
    line mxy(0), ginfo_winy, mxy(0), 0
    line ginfo_winx, mxy(1), 0, mxy(1)
 
    redraw 1
    goto *main

コメント

  • 「本当の」ってつけちゃうとmousex,yが偽者か?みたいに思われそうですが、これはヘルプの記述が悪いと思います。「クライアントエリア内のマウスのx(y)座標」という風に書いておけばいいと思います。あとは、座標の更新はマウスカーソルがクライアントエリア上にあるときに行われるのでオブジェクト上では更新されないということを知っていたほうがいいですね。とはいえ、ginfo系の命令を使えば算出できることが分からない人には参考になると思います。 -- kz3 2007-01-14 (日) 10:28:58
  • 正確を期するならWM_THEMECHANGEDやWM_SETTINGCHANGEやWM_STYLECHANGEDなどのメッセージを呼ばれた時にrm_initを呼び出した方がよいと思います。 -- Shark++ 2007-01-14 (日) 14:07:08
  • 「本当の」を「正確な」に変えてみました。完全解決にはなっていませんが、幾分か緩和されたのではないでしょうか。 -- eller 2007-01-14 (日) 16:43:34
  • 「本当の」だと「じゃあ、ウソなの?」、「正確な」だと「誤差があるの?」という印象をうけちゃうので、「常にmousex,mouseyを取得する」か「どこであってもmousex,mouseyを取得する」ぐらいがいいんじゃないでしょうか。 -- GENKI? 2007-01-17 (水) 22:25:08
  • GENKIさんありがとうございます。「正確な」ではなく「どこでも」、「mousex,mousey」ではなく「マウス座標」と表現したほうがいいかもしれませんね。検討してみます。 -- eller 2007-01-17 (水) 23:03:28
  • 描画先ウィンドウから見たマウス座標・・・見たいな事をどこかに書いて置いた方が分かりやすいと思います。 -- osakana 2007-01-18 (木) 23:48:18
  • ありがとうございます。追記しました。 -- eller 2007-01-22 (月) 11:16:35
  • 公式掲示板で話題に上がったので、発掘したShark++さんのスクリを元にサンプル作成。HSPTVブラウザでの動作検証はめんどいのでしてません。 [worried2] -- GENKI? 2010-07-13 (火) 22:43:52

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

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2010-07-13 (火) 22:43:53 (1243d)