|
|
2008/7/18(Fri) 17:33:21|NO.17380
bgscrでウィンドウを作っているんですが、ウィンドウの移動がうまくいきません
今までは
sendmsg hwnd,$00A1,2,0
を使っていたんですが、これでは移動中一時停止状態になってしまいます
それに、D&Dを使うプログラムなのでD&Dすると、もう一度クリックするまで止まってしまいます
かといって
width
をつかうとスピーディな動きについていけなくなってしまいます
この両方の問題をなくすことはできないのでしょうか?
|
|
2008/7/19(Sat) 00:44:58|NO.17398
>かといって
>width
>をつかうとスピーディな動きについていけなくなってしまいます
それは同時にやっている処理が重いからでしょう。
今やっている同時処理を分割し、1回のループ中では分割した内の
1つしかやらないようにするとか。
|
|
2008/7/19(Sat) 12:23:32|NO.17413
分割ですか…
一つのループの中で全部やらないで、いくつかのループを作って分けてやれ、ということでしょうか?
|
|
2008/7/19(Sat) 13:20:03|NO.17417
一応、タイマーを使う方法。
#uselib "user32.dll"
#func SetTimer "SetTimer" int,int,int,nullptr
#func KillTimer "KillTimer" int,int
#define WM_TIMER 0x0113
#define timeoutValue 50
bgscr 0,200,200
onclick gosub *onclick_
oncmd gosub *ontimer,WM_TIMER
onexit goto *onexit_
timerID = 1
SetTimer hwnd,timerID,timeoutValue
timerID = stat
stop
*ontimer
switch wparam
case timerID
gosub *main
swbreak
swend
return
*onexit_
KillTimer hwnd,timerID
end
*onclick_
if iparam!=0{end}
sendmsg hwnd,$a1,2,0
return
*main
redraw 0:syscolor 15:boxf:syscolor 18
pos 0,0:mes a:a++:redraw 1
return
|
|
2008/7/19(Sat) 16:15:54|NO.17419
なんか難しそうですね…
理解できそうにないです
このことは諦めて、widthでがんばることにします
|
|
2008/7/20(Sun) 06:52:30|NO.17428
例えば、元の同時処理が以下のようなものとすると
;同時処理スタート
redraw 0
color 255,255,255: boxf 0,34,639,479
color: pos 0,34
repeat 20
mes cnt
loop
redraw 1
;同時処理エンド
以下のように分割します。
;同時処理スタート
if mode==0 {
redraw 0
color 255,255,255: boxf 0,34,639,479
color: pos 0,34
repeat 5
mes cnt
loop
} else {
pos 0,mode*5*18+34
repeat 5,mode*5
mes cnt
loop
if mode==3: redraw 1
}
mode=(mode+1)\4
;同時処理エンド
|
|
2008/7/20(Sun) 07:39:24|NO.17431
なたでさんのスクリプト、メインが重い場合、どうなるか知りたかったので、
以下を追加したら、ウィンドウを移動すると落ちます。
どうも、HSPのエラーが出ているっぽいのですが、
すぐに消えるので確認できません。
repeat 30
wait 1
loop
|
|
2008/7/21(Mon) 00:51:51|NO.17463
waitやawaitはただ単に待つのではなく、
ウィンドウメッセージを割り込む時間を与えます。
なので、Timerを使うとawaitで止まっている間に、
さらにTimerで割り込みが入り、よくわかんなくなってエラーが出てると思います。
oncmdで割り込みを防止すると、エラーが出なくなりますが、逆に止まってしまいます。
待ちたい場合は、Sleepを使うと、この問題は避けられます。
#uselib "user32.dll"
#func SetTimer "SetTimer" int,int,int,nullptr
#func KillTimer "KillTimer" int,int
#define WM_TIMER 0x0113
#define timeoutValue 50 //時間
#uselib "kernel32.dll"
#func Sleep "Sleep" int
bgscr 0,200,200
onclick gosub *onclick_
oncmd gosub *ontimer,WM_TIMER
onexit goto *onexit_
timerID = 1
SetTimer hwnd,timerID,timeoutValue
timerID = stat
stop
*ontimer
oncmd 0
switch wparam
case timerID
gosub *main
swbreak
swend
oncmd 1
return
*onexit_
KillTimer hwnd,timerID
end
*onclick_
if iparam!=0{goto *onexit_} //スクリプトのミス 修正
sendmsg hwnd,$a1,2,0
return
*main
repeat 30
// wait 1
Sleep 10 // 10ms
loop
redraw 0:syscolor 15:boxf:syscolor 18
pos 0,0:mes a:a++:redraw 1
return
|
|
2008/7/21(Mon) 06:59:13|NO.17472
ありがとうございます。
後で、waitが臭いと思ったのですが、やはりそうでしたか。
おかげで、タイマー割り込みでも同時処理の重さは
解決できないのではないかという推測が正しいことを
確認できました。
|
|
2008/7/21(Mon) 11:17:51|NO.17476
>おかげで、タイマー割り込みでも同時処理の重さは
>解決できないのではないかという推測が正しいことを
>確認できました。
うそでした(^_^;;
タイマー割り込みを使えば、同時処理のところどころに
waitを入れるだけで解決できます。
下の例では「if cnt\10==0: wait 1」がウィンドウ移動を
軽くするために入れたwaitです。
#uselib "user32.dll"
#func SetTimer "SetTimer" int,int,int,nullptr
#func KillTimer "KillTimer" int,int
#define WM_TIMER 0x0113
#define timeoutValue 1 //時間
#uselib "kernel32.dll"
#func Sleep "Sleep" int
oncmd gosub *ontimer,WM_TIMER
onexit goto *l_exit
timerID = 1
SetTimer hwnd,timerID,timeoutValue
timerID = stat
gsel 0,-1: wid=200: heit=480: wx=(ginfo_dispx-wid)/2: wy=(ginfo_dispy-heit)/2
bgscr 2,wid,heit,heit,wx,wy
cls 1: mes "ドラッグで移動\nescキーで終了"
n=0
repeat
;同時処理スタート
redraw 0
color 191,191,191: boxf 0,34,639,479
color: pos 0,34
repeat 20
mes n+cnt
loop
redraw 1
repeat 60
if cnt\10==0: wait 1
Sleep 10
loop
;同時処理エンド
wait 1
n++
loop
*l_exit
KillTimer hwnd,timerID
end
*ontimer
ox=mx: oy=my
mx=ginfo_mx
my=ginfo_my
stick c,256,1 ;マウス左ボタンを非トリガータイプにする
if c&256 { ;マウスの左ボタンが押されているとき
wx+=mx-ox: wy+=my-oy
if wx<0 { wx=0 } else { if wx+wid>ginfo_dispx { wx=ginfo_dispx-wid } }
if wy<0 { wy=0 } else { if wy+heit>ginfo_dispy { wy=ginfo_dispy-heit } }
;width ginfo_dispx-heit,ginfo_dispy-heit,wx,wy ;ウィンドウの移動
width ,,wx,wy ;ウィンドウの移動
}
if c&128: end ;escキーで終了
return
| |
|