特にテーマは無く雑記かな。 最近は自分用メモが増えてきましたけど。
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


HSP2.61の小技その4というか小細工
2006年04月16日 (日) | 編集 |
今回は小技というよりは小細工と言った方が合っているような気がする内容です。

ウィンドウの終了ボタン(ウィンドウ右上の×ボタン)を押すと、通常は終了されるかonexitで指定されたラベルへジャンプします。
この動作は、どのウィンドウの×ボタンを押した時でも、同じように動作します。
しかし、例えばウィンドウIDが2のウィンドウの×ボタンが押された時だけは終了せずに違った動作を行う、等といった事ができないかな?というのが今回のお題です。

それでは、まずはスクリプト。
#include "llmod.as"
#include "hsgetmsg.as"
#define WM_CLOSE $00000010
#define WM_LBUTTONDOWN $00000201

    screen 0,240,40,6,40,40:title "メインウィンドウ"
mref bmscr,67:prm=bmscr.13,$FFFFFFF0,$06CF0000:setwndlong prm
    set_subclass:hwndmain=stat:set_message WM_LBUTTONDOWN
    mes "メインウィンドウ"
    mes "×ボタンを押すと終了します"
    gsel 0,1

    screen 2,240,40,6,40,120:title "サブウィンドウ"
mref bmscr,67:prm=bmscr.13,$FFFFFFF0,$06CF0000:setwndlong prm
    set_subclass:hwndsub=stat:set_message WM_CLOSE:set_message WM_LBUTTONDOWN
    mes "サブウィンドウ"
    mes "×ボタンを押しても終了しません"
    gsel 2,1

    onexit lonexit
    iexitflag=0
    goto lmainloop

*lmainloop
    wait 1
*lmainloopb
    repeat -1 ; ウィンドウメッセージの処理
        get_message
        if msgval.0==0:break
        if msgval.0==hwndmain{
            if msgval.1==WM_LBUTTONDOWN{
                dialog "メインウィンドウが左クリックされた"
            }
        }
        if msgval.0==hwndsub{
            if msgval.1==WM_LBUTTONDOWN{
                dialog "サブウィンドウが左クリックされた"
            }
        }
        if iexitflag{ ; ×ボタンが押された場合の処理
            if msgval.0==hwndsub{
                if msgval.1==WM_CLOSE{
                    dialog "サブウィンドウの×ボタンが押された"
                    iexitflag=0
                }
            }
        }
    loop
    if iexitflag:goto lprogend
    iexitflag=0
; ウィンドウメッセージ以外の処理はここへ
    goto lmainloop

*lonexit
    if iparam{
        goto lprogend
    }else{
        iexitflag=1 ; ×ボタンが押されたというフラグ
        goto lmainloopb ; waitを飛ばしてメッセージ処理へ
    }
*lprogend
    end
サブウィンドウの終了ボタン(×ボタン)を押されると、ダイアログが表示されるという事を実現しているスクリプトです。

ウィンドウの終了ボタンを押された際には、そのウィンドウにWM_CLOSEメッセージが送られます。そこで、onexitによりラベルのジャンプがシャットダウン等によるもので無い場合には、WM_CLOSEが受け取られたかどうかを調べています。
つまり、msgval.0には受け取ったウィンドウのハンドルが代入されるので、これでどのウィンドウの終了ボタンが押されたのかを判断します。

ここで終了させる場合には、なるべくonexitでジャンプしてからendでプログラムが終了するまでの間に、waitやawaitが入らないようにするのが望ましいと思います。

小細工な感じでややこしいですが、使う場面があるかもしれません。
もっとも、もっとシンプルに実装する方法があるのかもしれませんけどね。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。