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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0718
tsukaウィンドウの移動9解決


tsuka

リンク

2008/7/18(Fri) 17:33:21|NO.17380

bgscrでウィンドウを作っているんですが、ウィンドウの移動がうまくいきません

今までは
sendmsg hwnd,$00A1,2,0
を使っていたんですが、これでは移動中一時停止状態になってしまいます
それに、D&Dを使うプログラムなのでD&Dすると、もう一度クリックするまで止まってしまいます

かといって
width
をつかうとスピーディな動きについていけなくなってしまいます

この両方の問題をなくすことはできないのでしょうか?



この記事に返信する


ANTARES

リンク

2008/7/19(Sat) 00:44:58|NO.17398

>かといって
>width
>をつかうとスピーディな動きについていけなくなってしまいます
 それは同時にやっている処理が重いからでしょう。

 今やっている同時処理を分割し、1回のループ中では分割した内の
1つしかやらないようにするとか。



tsuka

リンク

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



tsuka

リンク

2008/7/19(Sat) 16:15:54|NO.17419

なんか難しそうですね…
理解できそうにないです

このことは諦めて、widthでがんばることにします



ANTARES

リンク

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 ;同時処理エンド



ANTARES

リンク

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



ANTARES

リンク

2008/7/21(Mon) 06:59:13|NO.17472

 ありがとうございます。
後で、waitが臭いと思ったのですが、やはりそうでしたか。
おかげで、タイマー割り込みでも同時処理の重さは
解決できないのではないかという推測が正しいことを
確認できました。



ANTARES

リンク

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



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