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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0912
シンバルマウスオーバーしているボタンのオブジェクトID入手2解決


シンバル

リンク

2020/9/12(Sat) 19:25:41|NO.91346

ボタンの上にカーソルを乗せた時にその要素の説明をprintで表示したいと考えています。

マウスでボタンをクリックするとstatに押されたボタンのオブジェクトIDが入りますが、ボタンにマウスオーバーした時点でそのボタンのオブジェクトIDを得るにはどうすれば良いでしょうか?

具体的にいうと、下のスクリプトの変数mouseoverに、マウスカーソルを乗せてるボタンのオブジェクトIDを入れたいです。よろしくお願いします。


#uselib "user32.dll" #func global TrackMouseEvent "TrackMouseEvent" sptr #func global GetWindowInfo "GetWindowInfo" sptr,sptr #const WM_MOUSEMOVE 0x0200 #const WM_MOUSELEAVE 0x02A3 #const TME_LEAVE 0x00000002 oncmd gosub *MOUSEMOVE,WM_MOUSEMOVE oncmd gosub *MOUSELEAVE,WM_MOUSELEAVE 品物 = "鉄の剣","鋼の剣","銀の剣" 説明 = "普通の剣","強めの剣","一流の剣" 攻撃力 = 3,4,6 color 0,0,0 boxf 10,10,400,100 pos 500,100 : button 品物(0),*Item pos 500,150 : button 品物(1),*Item pos 500,200 : button 品物(2),*Item stop *Item_mouseover color 0,0,0 boxf 10,10,400,100 pos 20,20 : color 255,255,255 stop *Item FLAG = 1 clrobj color 0,0,0 boxf 10,10,400,100 pos 20,20 : color 255,255,255 print 品物(stat)+"を購入した。\n攻撃力+"+攻撃力(stat) stop *MOUSEMOVE if FLAG = 0{ dim prm,4 prm(0) = 16,TME_LEAVE,hwnd TrackMouseEvent varptr(prm) FLAG = 1 color 0,0,0 boxf 10,10,400,100 pos 20,20 : color 255,255,255 print "いらっしゃい" } return *MOUSELEAVE dim WINDOWINFO,15 GetWindowInfo hwnd,varptr(WINDOWINFO) if (ginfo(0) >= WINDOWINFO(5))&(ginfo(1) >= WINDOWINFO(6))&(ginfo(0) < WINDOWINFO(7))&(ginfo(1) < WINDOWINFO(8)){ color 0,0,0 boxf 10,10,400,100 pos 20,20 : color 255,255,255 print 品物(mouseover)+"は装備すると攻撃力+"+攻撃力(mouseover) + "だよ" } FLAG = 0 return



この記事に返信する


とあるプログラマ

リンク

2020/9/12(Sat) 23:18:48|NO.91347

ボタンのウィンドウハンドルを確保しておき、それとカーソル直下のウィンドウハンドルを比較する という方法があります。

分かりやすいように変更があった箇所には //******* のコメントを付け足しています。

#uselib "user32.dll" #func global TrackMouseEvent "TrackMouseEvent" sptr #func global GetWindowInfo "GetWindowInfo" sptr,sptr #func global WindowFromPoint "WindowFromPoint" int,int //******* #const WM_MOUSEMOVE 0x0200 #const WM_MOUSELEAVE 0x02A3 #const TME_LEAVE 0x00000002 oncmd gosub *MOUSEMOVE,WM_MOUSEMOVE oncmd gosub *MOUSELEAVE,WM_MOUSELEAVE 品物 = "鉄の剣","鋼の剣","銀の剣" 説明 = "普通の剣","強めの剣","一流の剣" 攻撃力 = 3,4,6 dim hButton, 3 //******* color 0,0,0 boxf 10,10,400,100 // ボタンのウィンドウハンドルを確保しておく pos 500,100 : button 品物(0),*Item : hButton(0) = objinfo_hwnd(stat) //******* pos 500,150 : button 品物(1),*Item : hButton(1) = objinfo_hwnd(stat) //******* pos 500,200 : button 品物(2),*Item : hButton(2) = objinfo_hwnd(stat) //******* stop *Item_mouseover color 0,0,0 boxf 10,10,400,100 pos 20,20 : color 255,255,255 stop *Item FLAG = 1 clrobj color 0,0,0 boxf 10,10,400,100 pos 20,20 : color 255,255,255 print 品物(stat)+"を購入した。\n攻撃力+"+攻撃力(stat) stop *MOUSEMOVE if FLAG = 0{ dim prm,4 prm(0) = 16,TME_LEAVE,hwnd TrackMouseEvent varptr(prm) FLAG = 1 color 0,0,0 boxf 10,10,400,100 pos 20,20 : color 255,255,255 print "いらっしゃい" } return *MOUSELEAVE // カーソル直下のウィンドウハンドルを取得 hwnd_ = WindowFromPoint(ginfo_mx, ginfo_my) //******* foreach hButton //******* // 直下のウィンドウハンドルとボタンのウィンドウハンドルが一致しなければ繰り返し if (hwnd_ != hButton(cnt)) : continue //******* dim WINDOWINFO,15 GetWindowInfo hwnd,varptr(WINDOWINFO) if (ginfo(0) >= WINDOWINFO(5))&(ginfo(1) >= WINDOWINFO(6))&(ginfo(0) < WINDOWINFO(7))&(ginfo(1) < WINDOWINFO(8)){ color 0,0,0 boxf 10,10,400,100 pos 20,20 : color 255,255,255 print 品物(cnt)+"は装備すると攻撃力+"+攻撃力(cnt) + "だよ" //******* } break //******* loop //******* FLAG = 0 //******* return


余計なお世話ですが、ボタンにカーソルが移動したかどうかを把握するのにWM_MOUSELEAVEメッセージを使用しているようですが、個人的にはコールバック関数(modclbk3)でボタンをサブクラス化するか、メッセージフックでWM_MOUSEMOVE捕まえるほうがいいかな…?と個人的には思います…
WM_MOUSELEAVEは本来このような使い方とはちょっと違うような気がするので、想定外の事態があったりするかもしれません。



シンバル

リンク

2020/9/12(Sat) 23:34:01|NO.91348

ありがとうございました。WM_MOUSELEAVEで取得する方法は、実装方法が分からなかったので過去ログを漁って見つけてきたのですが、あまり推奨されないやり方なののですね。注意しておっしゃるやり方を頑張ってみたいと思います。



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