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