|
|
2013/12/22(Sun) 20:14:01|NO.58840
マウスでボタンを動かしたいです。
ディスクトップのアイコンと同じで、
ダブルクリック(またはクリック)→ラベルにジャンプ
長押しクリック→マウスが最後にきた座標にボタンを再表示
出来ればボタンが二重にならないようにしたいです。
|
|
2013/12/23(Mon) 16:20:34|NO.58852
#include "user32.as"
GetClassLong hwnd, -26
SetClassLong hwnd, -26, stat | $8
oncmd gosub *dc, $203 ;ondoubleclick
dim b,2
b = 9, 654
dim w,32 * 24
foreach b
w(b(cnt)) = cnt+1
loop
ldim bl,length(b)
lb = *b1,*b2
repeat -1
p = 32*(mouseY/20)+(mouseX/20)
getkey c ,1
if d = 0 & c {
if w(p) { n = w(p)-1 : d++}
}
if c = 0 : d = 0
if d {
if 0 < w(p) & w(p) ! (n+1) : p++
b(n) = p
w(p) = n+1
}
color 255,255,255 : boxf
foreach b
color 0,120*cnt,0
if d & n = cnt { boxf mouseX-9,mouseY-9,mouseX+9,mouseY+9 } else { boxf 20*(b(cnt)\32)+1,20*(b(cnt)/32)+1,20*(b(cnt)\32)+18,20*(b(cnt)/32)+18}
loop
redraw 1
redraw 2
await 20
loop
*dc
p = 32*(mouseY/20)+(mouseX/20)
n = -1
foreach b
if b(cnt) = p { n = cnt : break}
loop
if 0 <= n : gosub lb(n)
return
*b1
dialog "ボタン1が押されました"
return
*b2
dialog "ボタン2が押されました"
return
こういうことでしょうか?
|
|
2013/12/23(Mon) 18:55:17|NO.58859
上のスクリプトをbuttonにすることは無理でしょうか
また、使用したいボタンはこんな感じです
buffer 2
picload "画像名": gsel 0
objimage 2,0,0,0,0,0,0
objsize 53,22//サイズ
button "",*label
pos 53,-2
*label
|
|
2013/12/23(Mon) 21:15:21|NO.58860
HSPのButtonでは無理です
まず、Buttonだとボタン上でクリックを離した瞬間しか取得できません。
|
|
2013/12/24(Tue) 02:52:33|NO.58864
まず、ボタン上のクライアント座標の取得から調べてみたらどうですか。
それがきちんと取得できなければ、ボタン移動及びクリックされた座標を取得できないわけだから。
スクリーン座標のマウス座標は ginfo(0)とginfo(1) で取得できる。
それを、クライアント座標に変換する。
上記をすることによって、ボタン上の座標は正しく取得できる。
|
|
2013/12/24(Tue) 10:50:57|NO.58866
buttonに拘られる理由はなんでしょうか?
objimageで画像にしているようですし、
「画像をクリックしたらラベル先に飛ぶ」
では、どのような不都合があるのでしょうか?
|
|
2013/12/24(Tue) 14:45:45|NO.58867
/*ご参考(hscallbk.dllを使うともっとスマートに成るかも知れませんが)*/
#uselib "user32.dll"
#func global TrackMouseEvent "TrackMouseEvent" sptr
#func global WindowFromPoint "WindowFromPoint" sptr,sptr
#func global SetWindowPos "SetWindowPos" sptr,sptr,sptr,sptr,sptr,sptr,sptr
repeat 10 :pos rnd(640-64),rnd(480-24)
button gosub str(cnt),*label_0
loop ;ボタン上右クリックで移動開始
oncmd gosub *label_1,$200 ;WM_MOUSEMOVE
oncmd gosub *label_2,$2A3 ;WM_MOUSELEAVE
stop
*label_0 :title str(objinfo(stat,2))
return
*label_1 :nn = 16,2,hwnd,1000 :TrackMouseEvent varptr(nn)
:getkey kk,2
:if (kk) and (hh != 0) {SetWindowPos hh,0,mousex,mousey,0,0,1} else {hh = 0}
:title str(hh)
return
*label_2 :WindowFromPoint ginfo_mx,ginfo_my
:if (stat != hwnd) {hh = stat} else {hh = 0}
return
|
|
2013/12/25(Wed) 15:31:34|NO.58874
途中まで、buttonで作ってしまったのでbuttonにしました。
fortunehillさんの回答で
解決しました。
ありがとうございます。
|
|
2013/12/26(Thu) 19:16:31|NO.58886
それと、
#uselib "user32.dll"
#func global TrackMouseEvent "TrackMouseEvent" sptr
#func global WindowFromPoint "WindowFromPoint" sptr,sptr
#func global SetWindowPos "SetWindowPos" sptr,sptr,sptr,sptr,sptr,sptr,sptr
repeat 10 :pos rnd(640-64),rnd(480-24)
button gosub str(cnt),*label_0
loop ;ボタン上右クリックで移動開始
oncmd gosub *label_1,$200 ;WM_MOUSEMOVE
oncmd gosub *label_2,$2A3 ;WM_MOUSELEAVE
stop
*label_0 :title str(objinfo(stat,2))
return
*label_1 :nn = 16,2,hwnd,1000 :TrackMouseEvent varptr(nn)
:getkey kk,2
:if (kk) and (hh != 0) {SetWindowPos hh,0,mousex,mousey,0,0,1} else {hh = 0}
:title str(hh)
return
*label_2 :WindowFromPoint ginfo_mx,ginfo_my
:if (stat != hwnd) {hh = stat} else {hh = 0}
return
このプログラムの前後に、 #include "user32.as"
をすると、エラーになります。
どうすればよいでしょうか
|
|
2013/12/26(Thu) 21:18:25|NO.58894
#liclude "User32.as"
と
#uselib "User32"
#func global TrackMouseEvent "TrackMouseEvent" sptr
の登録名が同じであるから、エラーになる。
同じ登録名は登録することができないから、どちらか一方だけにする。
|
|
2013/12/27(Fri) 11:37:32|NO.58906
>>#liclude "User32.as"
と
#uselib "User32"
#func global TrackMouseEvent "TrackMouseEvent" sptr
の登録名が同じであるから、エラーになる。
同じ登録名は登録することができないから、どちらか一方だけにする。
ということは
user32.asを使用した命令は使えないということですか?
|
|
2013/12/27(Fri) 11:57:13|NO.58907
commonフォルダの中にあるuser32.asを
エディタで開いてみればどういう事か分かります。
|
|
2013/12/27(Fri) 12:03:39|NO.58908
つまり、user32.asの中で既に定義されている命令(関数)は
新しく定義する必要がなく
user32.asを#includeするだけで
TrackMouseEvent、WindowFromPoint、SetWindowPos
を使えると言う事です。
|
|
2013/12/27(Fri) 17:11:35|NO.58910
ありがとうございます
|
|