ボタンを作ってその上にマウスカーソルがあるかを調べる
今北隙間産業 2013/6/10(Mon) 22:06:57|NO.54809
ボタンを作ってその上にマウスカーソルがあるかを調べるようなものを作りたいです。
マウスカーソルがある=dialogを出す
マウスカーソルがない=何もなし
みたいな感じのものです
YSR 2013/6/10(Mon) 22:42:54|NO.54813
質問中の「ボタン」がbutton命令で出せる奴のことかは分からんが、
とりあえず「ある長方形内にマウスカーソルが存在するか」は普通にif文で分かるぞ?
ボタンの左上座標を(x1, y1)、右下座標を(x2, y2)とした場合、マウスカーソルの座標が
(mousex, mousey)であることから、
if (limit(mousex, x1, x2) = mousex) & (limit(mousey, y1, y2) = mousey) {
;マウスがボタンの上にある時の処理
dialog "test"
}
else{
;マウスがボタンの上にない時の処理
}
といったコードで判定できる。
MillkeyStars 2013/6/10(Mon) 22:46:38|NO.54814
「ボタンを作って」って言うのは、命令の Button で作ったボタンの事かな?
1,命令でボタンを作ったのであればカーソルの下にある、ウィンドウハンドルを調べないとダメ。
2,自分でボタン擬似的に作るのであれば、座標の範囲でチェックすればいい。
とりあえず、質問内容だと、回答する人も判断できないと思うし、どっちか確定した方がいいかもね。
今北隙間産業 2013/6/11(Tue) 19:49:31|NO.54827
拾いもののサンプルソースなんですが
#uselib "user32.dll"
#cfunc WindowFromPoint "WindowFromPoint" int,int
pos 100,100
button gosub "test",*@f
hButton = objinfo(stat,2)
repeat
wait 1
if (hButton = WindowFromPoint(ginfo(0),ginfo(1))){
title "ボタンの上に載ってます"
}else{
title ""
}
loop
*@
return
これでできました、
複数のボタンも対応したいんですが
どのようなソースを書いたらいいのかわかりません><
test 2013/6/11(Tue) 20:17:06|NO.54828
そのサンプルソースの意味を自分で理解できないと、それ以上のことをしようとしてもわからずその度に質問することになってしまいます。
ですから、まずその意味を調べましょう。
そのソースの肝となっているのはWindowFromPointですが、それはHSPの標準機能ではありません。
これは一番上の2行で定義されていて、user32.dllの中に入っている関数です。
つまりWindowsの機能であるWindows APIを使用しています。
Windows APIについて詳しく調べるには、MSDNというサイトを使うのが便利です。例えば「WindowFromPoint MSDN」とかで検索してみましょう。
今北隙間産業 2013/6/11(Tue) 20:39:17|NO.54829
いろいろ調べたんですが、、最終的にわかりませんでした・・・・
WindowFromPoint(ginfo(0),ginfo(1))
↑x ↑y
それぞれの座標が入ってることはわかりました。
でも複数の座標をどうやって対応させればいいのかがわかりません
test 2013/6/11(Tue) 20:52:33|NO.54830
それぞれの座標とは何でしょうか。
ginfoは調べましたか?
ginfo(0),ginfo(1)は、マウスの座標です。ですからそのコードは、WindowFromPointにマウスの座標を渡していることになるのです。
調べるのはマウスがボタンに載っているかどうかなので、ボタンが何個になろうと実はWindowFromPointの引数は変わりません。
WindowFromPointの返り値については調べましたか。MSDNには「関数が成功すると、指定した座標を含むウィンドウのハンドルが返ります。」と書いてあったのを見たと思います。
実はそもそも、Windowsにおいては、普段自分たちが「ウィンドウ」と読んでいるものばかりでなく、ボタンとかも全部ウィンドウの一種として扱われます。そして、それぞれのウィンドウを区別するためのIDのようなものがついています。それがウィンドウハンドルです。
つまりWindowFromPointの効果は、マウスの位置にあるウィンドウが何かを調べることだったのです。
もしマウスがボタンの上にあったらボタンのウィンドウハンドルが返ってきますから、あらかじめボタンのウィンドウハンドルを調べておいてそれと比べればいいのです。
あらかじめボタンのウィンドウハンドルを調べている部分はhButton = objinfo(stat,2)
です。
では複数のボタンを調べるにはどうすればいいかというと、全部のボタンのウィンドウハンドルをあらかじめ調べておいて、WindowFromPointの返り値と一つ一つ比べればいいのです。
今北隙間産業 2013/6/12(Wed) 18:49:16|NO.54842
testさん
なるほどー
詳しい説明ありがとうございます。
testさんの説明でいろいろ理解できて
#uselib "user32.dll"
#cfunc WindowFromPoint "WindowFromPoint" int,int
pos 100,100
button gosub "test",*@f
hButton = objinfo(stat,2)
pos 200,100
button gosub "test",*@f
yButton = objinfo(stat,2)
repeat : await 1
if (hButton = WindowFromPoint(ginfo(0),ginfo(1))){
title "ボタンの上に載ってます"
}else{
title ""
}
if (yButton = WindowFromPoint(ginfo(0),ginfo(1))){
title "ボタンの上に載ってます"
}else{
title ""
}
loop
*@
return
このようなコードにしたらできました。
ですがタイトルがちらついてしまうんですがこれは何故でしょうか??
test 2013/6/12(Wed) 22:15:41|NO.54848
そのコードでは、2つのボタンについて別々に判定していますね。
例えばhButtonのほうのボタンにマウスが載っているとしましょう。
一つ目のif文では載っていると判定されて、title "ボタンの上に載ってます"
の行によってタイトルが"ボタンの上に載ってます"に変わります。
しかし、直後の二つ目のif文ではyButtonのほうのボタンには載ってないと判定されますから、title ""
が実行されてタイトルが戻ってしまいます。
これを繰り返した結果タイトルが高速で切り替わって、タイトルのちらつきにつながっています。
直すためには、1つ目のボタンに載っているときは2つ目のボタンに載っていることはありませんから、1つ目に載っていないときだけ2つ目の判定をするようにするとよいでしょう。
また、2つのif文でWindowFromPointを2回呼び出していますが、同じ結果になるので2回呼び出すのは無駄です。1回呼び出したら変数などに入れてとっておきましょう。
今北隙間産業 2013/6/12(Wed) 23:45:16|NO.54850
>>testさん
#uselib "user32.dll"
#cfunc WindowFromPoint "WindowFromPoint" int,int
pos 100,100
button gosub "test",*@f
hButton = objinfo(stat,2)
pos 200,100
button gosub "test",*@f
yButton = objinfo(stat,2)
repeat : await 1
if (hButton = WindowFromPoint(ginfo(0),ginfo(1))){
title "ボタンの上に載ってます"
}else{
title ""
}
if (yButton = WindowFromPoint(ginfo(0),ginfo(1))){
title "ボタンの上に載ってます"
}else{
}
loop
*@
return
ここまでできましたが僕の技術の限界でこれ以上はできませんでした><
もう3時間やってますがだめです;;><
今北隙間産業 2013/6/12(Wed) 23:46:40|NO.54851
と思っちゃったらできちゃいました!
ありがとうございます
解決したのでソースをあげておきますね
#uselib "user32.dll"
#cfunc WindowFromPoint "WindowFromPoint" int,int
pos 100,100
button gosub "test",*@f
hButton = objinfo(stat,2)
pos 200,100
button gosub "test",*@f
yButton = objinfo(stat,2)
repeat : await 1
if (hButton = WindowFromPoint(ginfo(0),ginfo(1))){
title "ボタンの上に載ってます"
}else{
if (yButton = WindowFromPoint(ginfo(0),ginfo(1))){
title "ボタンの上に載ってます"
}else{
title ""
}
}
loop
*@
return
ですが、もっとシンプルなソースにしたいですがどうしたらシンプルになりますか??
test 2013/6/13(Thu) 00:01:34|NO.54852
さっき述べたWindowFromPointを2回読んでいるのが無駄という部分が改善できます。こんな感じになります。
handle=WindowFromPoint(ginfo(0),ginfo(1))
if (hButton = handle){
title "ボタンの上に載ってます"
}else{
if (yButton = handle){
title "ボタンの上に載ってます"
}else{
title ""
}
}
さらに、"ボタンの上に載ってます"という文字列が2回出ています。どちらのボタンでも同じ文字列でいいなら、次のように簡略化できます。
handle=WindowFromPoint(ginfo(0),ginfo(1))
if (hButton = handle or yButton = handle){
title "ボタンの上に載ってます"
}else{
title ""
}
今北隙間産業 2013/6/13(Thu) 00:17:16|NO.54853
>>testさん
なるほどです!
testさんのソースを付け足して頂きました所できました^^
この度はありがとうございました!
またお世話になることがありましたらよろしくお願いします!