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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0905
たきsendmsgについて8未解決


たき

リンク

2017/9/5(Tue) 03:59:35|NO.81229

複数ウィンドウを使ってgselやハンドルを格納して使うまではよいのですが
sendmsgをサンプルにもあるようにonclickからとんで書いてあるやつハンドルだけかえてはりつけたんですが
画像はそのまま表示されますがその後クリックに反応しなくなります
どうしたら改善できますか?
またできればどういう理屈というか流れになってるかしりたいです
sendmsgのシステム変数に意味も理解できないです



この記事に返信する


たき

リンク

2017/9/5(Tue) 04:55:19|NO.81230

ウィンドウ動かした後ウィンドウぜんたいが移動するためのクリック範囲みたいになってしまってます



科学太郎

リンク

2017/9/5(Tue) 13:43:48|NO.81232

> どうしたら改善できますか?
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」関係の資料を
ネット検索すれば、いろいろと見つかりますよ。



掘木

リンク

2017/9/5(Tue) 19:36:37|NO.81235

どこまでの説明がほしいのかよくわからないので適当に。


>画像はそのまま表示されますがその後クリックに反応しなくなります

クリックの検知方法はどうやっているんでしょうか。
repeatやgotoなどによるgetkeyの監視ではこの場合は検出できないです。詳細は後。
onclickの上書きにも気を付けないといけないです。onclickはウィンドウ単位の指定じゃないので。


>どうしたら改善できますか?

何をしたいのか明記することで解決策が見つかると思います。

追加した結果クリックに反応しなくなったのでそれを改善?
ならば、その追加する前のコードに戻して終いじゃないのと思ってしまいます。


>またできればどういう理屈というか流れになってるかしりたいです
>sendmsgのシステム変数に意味も理解できないです

sendmsg hwnd,$00A1,2,0
第二引数がメッセージIDです。それに応じて第3、第4パラメータの意味が変わります。
http://ht-deko.com/tech068.html
私はいつもこの辺で漁っています。足りない場合はwinuser.hを確認。


$00A1 : WM_NCLBUTTONDOWN
2 : HTCAPTION
0 : 座標値(0,0)
WM_NCLBUTTONDOWNで調べると、wparam、lparamに関しては芋づる式に出てきます。(ただしHSP向けの情報とは限らない)
指定のウィンドウに対して、
「キャプションバー(ウィンドウの上の青い部分)をクリックされたことにしてねー」
と要求しています。

サンプルではonclickの飛び先に居てますので、(通常は)マウスボタンが押されています。
押されているのが左マウスボタンならば、続くマウスの移動に対して、
キャプションバーを左クリックしながらのマウス移動(ドラッグ)と認識しウィンドウが動きます。


ウィンドウの移動中はwait系命令によってHSPのプログラムの動作は移動が完了するまで停止します

これを回避する方法としてタイマーを使用する手法があります。SetTimerあたりで調べてみるとよいかと。



たき

リンク

2017/9/5(Tue) 20:07:08|NO.81236

回答ありがとうございます
まだ全く理解できていませんがどんな検知はかということなので、
クリックの検知はstickで条件式で以上以下で囲んでクリックされたらという単純なものです
ウィンドウにマウスがある場合はそのウィンドウがアクティブになるようにしてます
なのでほかにidが変わらないとは思うのですが未熟なのでわかりません
ためしにwidthも使ってみたりonclickつかわずにやったりgselいれても反応しなくなります



科学太郎

リンク

2017/9/5(Tue) 21:33:12|NO.81238

> クリックの検知はstickで条件式で以上以下で囲んでクリックされたらという単純なものです
ループ内ですよね。

> ためしにwidthも使ってみたりonclickつかわずにやったりgselいれても反応しなくなります
oncmdを使ってますか?

こちらの経験では、複数ウインドウに oncmd で割り込みを発生させるとループ内の処理が機能しなくなります。
つまり、割り込みが発生したときに別のウインドウに移動するわけです。

この現象は2つのウインドウにループ処理があって、
1つ目のウインドウで割り込みが発生すると
2つ目のウインドウに移動してしまう。

だから
1つ目のウインドウのループ処理は割り込みが発生したときに抜け出て
2つ目のウインドウのループ処理に移ります。

確認ですが複数ウインドウ毎にループ処理がありますか?
もしも、複数ウインドウのそれぞれにループ処理があった場合は、
上記のように割り込みや gsel したときにループ処理を抜けてします。(stopかも)



たき

リンク

2017/9/5(Tue) 22:22:58|NO.81242

oncmdやwidthどちらでも止まりました
特にどちらを使うとかは決めてません
マウス位置でできないかなあと思いwidth使ってみたらウィンドウがブレながら動きます
メインはgotoでループ
ウィンドウは3つあり画像読み込み時にループ使ってます
ループ内ではクリックしてません



たき

リンク

2017/9/5(Tue) 22:36:40|NO.81244

あ、すいませんメニューにoncmdあります
読み間違えました、0のメインウィンドウにあります
メニューに使ってました



MillkeySoftw

リンク

2017/9/6(Wed) 03:05:32|NO.81245

質問の内容がいまいちわからないけど、
>>マウス位置でできないかなあと思いwidth使ってみたらウィンドウがブレながら動きます
と書かれているから、メインウィンドウの一部をドラッグすると連動して B. C. ウィンドウが動くってことなのかな・・・

違ったらごめん。



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