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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0212
bensan不明な原因で「応答なし」4解決


bensan

リンク

2012/2/12(Sun) 22:04:52|NO.44821

分かりにくいタイトルで申し訳ございません。
とあるものを作っていたんですが、原因不明のバグにぶちあたりました。
以下のスクリプトは、それを最低限のスクリプトにしたものです。
で、このスクリプトを実行し、ボタンを押すと「応答なし」となり落ちます。

※pushbtn関数は「Let's HSP」で配布中のモジュールからお借りしたものです。
 http://lhsp.s206.xrea.com/hsp_object1.html


#uselib "USER32.DLL" #include "user32.as" goto *Start #deffunc pushbtn str v1, int v2, int v3 _v2 = v2 chkbox v1, _v2 idObject = stat if v3 { SetWindowLong objinfo (idObject, 2), -16, $50021009 } else { SetWindowLong objinfo (idObject, 2), -16, $50001009 } return idObject *Start Windowhwnd.0=hwnd pos 0, 0:pushbtn "あ",1,1 pos 0, 50:pushbtn "い" pos 0,100:pushbtn "う" bgscr 1, 200,200,2 //screenにするとOK WindowHwnd.1=hwnd color 255,192,192:boxf color:mes "bgscrウィンドウ" gsel 1:width 256,512,300, 0 SetParent WindowHwnd.1,WindowHwnd.0 gsel 1,1 //←これをコメントアウトするとOK gsel 0

いろいろこれについて調べたところ、
・子ウィンドウを bgscr でなく screen で作成すると、ボタンは正常に動作する。
・bgscrで作成しても、それを非表示のままにしておけば、ボタンは正常に動作する。
ことが判明しました。

もうわけがわかりません。誰かだいたいでもいいので、落ちる原因を教えてください。
自分には全く分かりません。



この記事に返信する


ヂオン

リンク

2012/2/13(Mon) 03:56:48|NO.44824

どうやら SetWindowLong で設定されている スタイルが間違えているようです
多分これで動くはず


#uselib "USER32.DLL" #include "user32.as" goto *Start #const global WS_CHILD $40000000 ; 子ウィンドウを作成します。 #const global WS_VISIBLE $10000000 ; 可視状態のウィンドウを作成します。 #const global BS_AUTOCHECKBOX $00000003 #const global BS_PUSHLIKE $00001000 #const global BS_TEXT 0 #deffunc pushbtn str v1, int v2, int v3 _v2 = v2 chkbox v1, _v2 idObject = stat #const TOGGLEBUTTON_STYLE WS_CHILD|WS_VISIBLE | BS_TEXT|BS_PUSHLIKE|BS_AUTOCHECKBOX if v3 { SetWindowLong objinfo (idObject, 2), -16, TOGGLEBUTTON_STYLE|0x20000 } else { SetWindowLong objinfo (idObject, 2), -16, TOGGLEBUTTON_STYLE } return idObject *Start Windowhwnd.0=hwnd pos 0, 0:pushbtn "あ",1,1 pos 0, 50:pushbtn "い" pos 0,100:pushbtn "う" bgscr 1, 200,200,2 //screenにするとOK WindowHwnd.1=hwnd color 255,192,192:boxf color:mes "bgscrウィンドウ" gsel 1:width 256,512,300, 0 SetParent WindowHwnd.1,WindowHwnd.0 gsel 1,1 //←これをコメントアウトするとOK gsel 0



bensan

リンク

2012/2/13(Mon) 20:46:04|NO.44846

>>ヂオンさん
回答ありがとうございます。正常に動作はするのですが、私がしたいことは、
・「あ」「い」「う」をラジオボタンのように切り替えたい
  (「あ」「い」「う」のうち1つだけがへこんでいる状態を作りたい)
 ということです。
説明不足で申し訳ありません。
私の環境は Windows 7 HomePremium 64bit版、HSP3.3です。

付け加えて、これが一時的なものかと思っていましたが、やはり今日Windowsを最初から起動して
元のプログラムを実行すると「応答なし」となります。

どなたか対処方法をよろしくお願いします。



ヂオン

リンク

2012/2/13(Mon) 23:24:02|NO.44849

ちょっと早とちりだった様です。
色々考えて見ましたが どうやら bgscr で作成されたウィンドウのスタイルに WS_POPUP が含まれているのがいけなかったようです。
SetParent 関数 を実行する際には そのウィンドウのスタイルから
WS_POPUP 除外 して WS_CHILD を追加するべき見たいです。

ソースは msdn の SetParent の項から です。
http://msdn.microsoft.com/ja-jp/library/cc411061.aspx

WS_POPUP 除外 して WS_CHILD を追加した場合に起こる変化としては
主に 子ウィンドウを クリックしても 、それが active に ならない 等の利点があります。(普通にキー操作などのメッセージは送られます)
要するに Objectの様に機能するようになります。

それとついでですが
hwnd とは (handle window) の略です
よって windowhwnd とは (window handle window) の意味に成り 間違いと成ります。

気に成ったので 指摘させていただきました。


#include "user32.as" // ウィンドウスタイル #const global WS_CHILD $40000000 // このウィンドウは子ウィンドウです。WS_POPUP と 同時指定できません。 #const global WS_VISIBLE $10000000 // このウィンドウは可視状態です。 #const global WS_POPUP $80000000 // このウィンドウはポップアップウィンドウです。 WS_CHILD と 同時指定できません。 // ボタンスタイル #const global BS_PUSHLIKE $00001000 // プッシュボタン ライク なボタンで有る #const global BS_TEXT 0 // テキストを使用する (標準) #const global BS_AUTORADIOBUTTON $00000009 // ラジオボタンの処理を自動で行う // getwindowlong setwindowlong #const global GWL_STYLE $FFFFFFF0 // ウインドウスタイルにaccess // setwindowpos #const global SWP_FRAMECHANGED $00000020 // ウィンドウスタイル 等の変更を更新する #const global SWP_SHOWWINDOW $00000040 // ウィンドウを表示する #const global SWP_NOSIZE $00000001 // サイズ変更を行わない #const global SWP_NOMOVE $00000002 // 移動を行わない #module // wt_ = ウィンドウテキスト // ischk_ = それがチェックされているか 1 でcheck // istop_ = それはグループの先頭で有るオブジェクトか 1 でそれが先頭Object // ispushlike_ = それはプッシュボタン形式のオブジェクトか 1 でそれはボタン形式 #deffunc radiobutton str wt_, int ischk_ , int istop_ , int ispushlike_ , local style_ , local hwnd_ , local rt_ _v2 = ischk_ #const TOGGLEBUTTON_STYLE WS_CHILD|WS_VISIBLE | BS_TEXT | BS_AUTORADIOBUTTON chkbox wt_,_v2 rt_ = stat:hwnd_=objinfo_hwnd(stat) SetWindowLong hwnd_ , GWL_STYLE , TOGGLEBUTTON_STYLE | (istop_!=0)*0x20000 | (ispushlike_!=0)*BS_PUSHLIKE // 動いているようですが 保険で SetWindowPos SWP_FRAMECHANGED を実行します SetWindowPos hwnd_,0,0,0,0,0,SWP_FRAMECHANGED | SWP_NOSIZE|SWP_NOMOVE return rt_ #global hwnd_main = hwnd pos 0, 0:radiobutton "あ",1,1,1 pos 0, 50:radiobutton "い",,,1 pos 0,100:radiobutton "う",,,1 bgscr 1, 200,200,2 //screenにするとOK hwnd_child = hwnd color 255,192,192:boxf color:mes "bgscrウィンドウ" GetWindowLong hwnd,GWL_STYLE SetWindowLong hwnd,GWL_STYLE,((stat|WS_POPUP) ^ WS_POPUP) | WS_CHILD// WS_POPUP を 折って WS_CHILD を立てます。 SetParent hwnd_child,hwnd_main // 表示 と ウィンドウスタイルの更新 と サイズと位置の変更 // ウィンドウスタイルを変更したら SetWindowPos に SWP_FRAMECHANGED 指定して実行するべきです。 SetWindowPos hwnd,0,0,300,200,200,SWP_FRAMECHANGED|SWP_SHOWWINDOW gsel 0



bensan

リンク

2012/2/14(Tue) 17:49:20|NO.44865

>>ヂオンさん
どうもありがとうございます。おかげできちんと動くようになりました。
あと、"WindowHwnd"についての指摘もありがとうございます。
これでまた作業が進みます!



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