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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1222
koyaマウスでボタンの位置を動かしたい(ディスクトップのアイコンみたいなの)13解決


koya

リンク

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
こういうことでしょうか?



koya

リンク

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だとボタン上でクリックを離した瞬間しか取得できません。



MillkeyStars

リンク

2013/12/24(Tue) 02:52:33|NO.58864

まず、ボタン上のクライアント座標の取得から調べてみたらどうですか。
それがきちんと取得できなければ、ボタン移動及びクリックされた座標を取得できないわけだから。

スクリーン座標のマウス座標は ginfo(0)とginfo(1) で取得できる。
それを、クライアント座標に変換する。

上記をすることによって、ボタン上の座標は正しく取得できる。



玄冬

リンク

2013/12/24(Tue) 10:50:57|NO.58866

buttonに拘られる理由はなんでしょうか?
objimageで画像にしているようですし、
「画像をクリックしたらラベル先に飛ぶ」
では、どのような不都合があるのでしょうか?



fortunehill

リンク

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



koya

リンク

2013/12/25(Wed) 15:31:34|NO.58874

途中まで、buttonで作ってしまったのでbuttonにしました。
fortunehillさんの回答で
解決しました。
ありがとうございます。



koya

リンク

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"

をすると、エラーになります。 どうすればよいでしょうか



MillkeyStars

リンク

2013/12/26(Thu) 21:18:25|NO.58894

#liclude "User32.as"

#uselib "User32"
#func global TrackMouseEvent "TrackMouseEvent" sptr
の登録名が同じであるから、エラーになる。

同じ登録名は登録することができないから、どちらか一方だけにする。



koya

リンク

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
を使えると言う事です。



koya

リンク

2013/12/27(Fri) 17:11:35|NO.58910

ありがとうございます



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