| 
					 
							
													 
							
						 
						
 
 | 
 | 
 
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 
ありがとうございます 
 
 |   
  
					 |