> どうしたら改善できますか?
gselとginfo_selの関係でしょうかね?
> またできればどういう理屈というか流れになってるかしりたいです
複数ウインドウの場合は on 系の割り込みが発生すると ginfo_act や ginfo_intid で
割り込みが発生したウインドウIDを取得できます。
そこで gsel 命令で移動してから処理をしますが、
割り込みの処理が終わった後に gsel 命令で
割り込みが発生する前のウインドウIDに戻す必要があります。
↑
多分、この辺が原因でしょう。
//------------------------------------------------------------------------------
// 複数ウインドウのOnClick処理サンプル by 科学太郎
//==============================================================================
// @URL(http://hsp.tv/play/pforum.php?mode=all&num=81229)→「sendmsgについて」
//------------------------------------------------------------------------------
//--------------------------------------
// 列挙定数(ウインドウID)
//--------------------------------------
#enum global WID_MAIN=0
//--------------------------------------
// メイン部
//--------------------------------------
*Init
OnSelInit 10
*Main
;複数ウインドウの作成
repeat 5
screen cnt,640,480,SCREEN_NORMAL
loop
;メイン・ウインドウの設定
gsel WID_MAIN
syscolor 15:boxf:color:title "複数ウインドウのOnClick処理サンプル"
onclick gosub *OnMouseClick
stop
//--------------------------------------
// 描画先スタックの初期化
//--------------------------------------
#deffunc OnSelInit int _max_
dim oncmdStack,(_max_)
dim oncmdCount
return
//--------------------------------------
// 描画先スタックの保存
//--------------------------------------
#deffunc OnSelPush int _id_
if(oncmdCount)<length(oncmdStack){
oncmdStack(oncmdCount)=ginfo_sel
oncmdCount++
gsel(_id_)
}
return
//--------------------------------------
// 描画先スタックの復元
//--------------------------------------
#deffunc OnSelPop
if(oncmdCount>0){
oncmdCount--
gsel oncmdStack(oncmdCount)
}
return
//--------------------------------------
// マウスクリックの割り込み処理
//--------------------------------------
*OnMouseClick
if(ginfo_act<0):return ;エラー対策
OnSelPush ginfo_act ;ginfo_selの保存
/*
ここにクリックの処理を書く
*/
OnSelPop ;ginfo_selの復帰
return
//------------------------------------------------------------------------------
// End of No81229.hsp
//------------------------------------------------------------------------------
上記の OnSelPush、OnSelPop は割り込み処理の始まりと終わりに記述する命令です。
この2つの命令で割り込みが発生する前のウインドウIDの保存と復帰を行えます。
onkey、onclick、onexit、onerror の場合は ginfo_act を OnSelPush 命令で保存します。
oncmd の場合は ginfo_intid を OnSelPush 命令で保存します。
その後に割り込みの処理を行いますが、
割り込み処理中に割り込み処理が発生する可能性があります。
そこで OnSelInit 命令でスタックの最大値を指定して初期化します。
割り込み処理が終わったら保存していたウインドウIDを OnSelPop 命令で戻します。
これで割り込みが発生する前のウインドウIDに戻りますので、
クリック後(割り込み発生後)の動作が正しくなると思います。
> sendmsgのシステム変数に意味も理解できないです
iParam、wParam、lParamであれば「Win32API」関係の資料を
ネット検索すれば、いろいろと見つかりますよ。