> mousexとmouseyでは、マウスがオブジェクト上にあるとき、取得が停止してしまうらしいです。
正確には WM_MOUSEMOVE メッセージがオブジェクトに送られるために
メイン・ウインドウは WM_MOUSEMOVE メッセージによって得られる mouseX、mouseY を取得不可能。
なお、オブジェクトをサブクラス化してメイン・ウインドウに WM_MOUSEMOVE メッセージを送れば
mouseX、mouseY を取得可能になります。
しかし、HSP は標準ではオブジェクトをサブクラス化することが出来ませんね。
そこで次のようになります。
#include "User32.as"
title "オブジェクト上のマウス座標(クライアント座標)を取得"
dim po,2
dim rc,4
sdim a
pos 0,40:mesbox a,640,480,1
repeat
;マウス座標
po=ginfo_mx,ginfo_my
ScreenToClient hWnd,varptr(po)
;メッセージ・ボックスの左上隅
GetWindowRect objinfo_hwnd(0),varptr(rc)
ScreenToClient hWnd,varptr(rc)
po(0)-=rc(0)
po(1)-=rc(1)
;表示
redraw 0
color $FF,$FF,$FF:boxf
color $00,$00,$00
pos 0, 0:mes "MOUSEX: "+po(0)
pos 0,20:mes "MOUSEY: "+po(1)
redraw 1
await 1
loop
stop
上記の方法は
(1)マウスのスクリーン座標をクライアント座標に変換
(2)オブジェクトの矩形で左上隅だけをクライアント座標に変換
(3)マウスのクライアント座標からオブジェクトのクライアント座標を引く
(4)これによりオブジェクト版の mouseX、mouseY が取得可能
また、複数のオブジェクトがある場合には次のようにすれば良いでしょう。
#include "User32.as"
title "オブジェクト上のマウス座標(クライアント座標)を取得"
dim po,2
dim rc,4
sdim a
pos 0, 40:mesbox a,320,440,1
pos 320, 40:mesbox a,320,220,1
pos 320,260:mesbox a,320,220,1
repeat
;マウス座標
po=ginfo_mx,ginfo_my
ScreenToClient hWnd,varptr(po)
;メッセージ・ボックスの左上隅
WindowFromPoint ginfo_mx,ginfo_my
GetWindowRect stat,varptr(rc)
ScreenToClient hWnd,varptr(rc)
po(0)-=rc(0)
po(1)-=rc(1)
;表示
redraw 0
color $FF,$FF,$FF:boxf
color $00,$00,$00
pos 0, 0:mes "MOUSEX: "+po(0)
pos 0,20:mes "MOUSEY: "+po(1)
redraw 1
await 1
loop
stop
上記の WindowFromPoint 命令はマウス座標直下のウインドウ・ハンドルを取得するものです。
これを使えば objinfo_hwnd 関数を使わなくて済みます。