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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0208
pオブジェクト上のマウス座標取得5解決


p

リンク

2016/2/8(Mon) 19:14:16|NO.74519

mousexとmouseyでは、マウスがオブジェクト上にあるとき、取得が停止してしまうらしいです。

pos 0,40 sdim a mesbox a,640,480,1 repeat color 255,255,255 boxf color 0,0,0 pos 0,0:mes "MOUSEX: "+mousex pos 0,20:mes "MOUSEY: "+mousey wait 1 loop
ginfo_mxでスクリーン上の座標を所得して、それからウィンドウの座標をひけば、
正常に所得できるとは思うのですが、ウィンドウ上のマウス座標を所得する
API関数とかないですか?



この記事に返信する


cats

リンク

2016/2/8(Mon) 19:26:14|NO.74520

GetCursorPos関数で取得できると思います。
この関数はスクリーンの絶対的な座標を取得するので、
特定のウィンドウ上の座標に変換するにはScreenToClient関数を使います。
https://msdn.microsoft.com/ja-jp/library/cc364640.aspx
https://msdn.microsoft.com/ja-jp/library/cc410572.aspx



可憐

リンク

2016/2/8(Mon) 21:33:51|NO.74522

クリック時ですがこんな感じで取得できます。


#define WM_PARENTNOTIFY $210 oncmd goto *mousexmousey, WM_PARENTNOTIFY objsize 100,100 : button "押して下さい",*a stop *mousexmousey title "X = " +(lparam & $ffff) + "Y = "+ ((lparam >> 16) & $ffff) *a



科学太郎

リンク

2016/2/8(Mon) 22:42:31|NO.74524

> 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 関数を使わなくて済みます。



p

リンク

2016/2/9(Tue) 11:05:15|NO.74528

みなさん、ありがとうございます。
catsさんの方法を使わせていただくことにしました。
GetCursorPosとScreenToClientを使ったものです。

#uselib "user32.dll" #func GetCursorPos "GetCursorPos" int #func ScreenToClient "ScreenToClient" int,int dim ar,2 repeat redraw 0 cls GetCursorPos varptr(ar) ScreenToClient hwnd,varptr(ar) foreach ar mes ar(cnt) loop redraw 1 wait 2 loop



p

リンク

2016/2/9(Tue) 11:08:06|NO.74529

GetCursorPosのかわりにginfo_mx,ginfo_myをつかってもOK!

#uselib "user32.dll" #func ScreenToClient "ScreenToClient" int,int dim ar,2 repeat redraw 0 cls ar(0)=ginfo_mx ar(1)=ginfo_my ScreenToClient hwnd,varptr(ar) foreach ar mes ar(cnt) loop redraw 1 wait 2 loop



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