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