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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0610
今北隙間産業ボタンを作ってその上にマウスカーソルがあるかを調べる12解決


今北隙間産業

リンク

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さんのソースを付け足して頂きました所できました^^

この度はありがとうございました!

またお世話になることがありましたらよろしくお願いします!



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