oncmd の段階で thismod の値 (インスタンス) が何であったかを
何らかの方法で覚えておき、ラベルが呼ばれた後に判別する必要があります。
この例ではウィンドウ ID ごとにインスタンスが異なるので、
ウィンドウ ID をインデックスとする配列変数を用意して、
それに thismod を代入しておく方法があります。
(ただしインスタンスを = で代入して作った値はただの参照であり、
元のインスタンスが delmod などで破棄されると無効になるので注意。)
#module m_mywin window_id_
// モジュールの初期化
#deffunc init@m_mywin
// struct 型の無効な値を用意しておく。
dimtype s_nullmod, vartype("struct")
// ウィンドウ ID w に対応するインスタンスを
// s_instance_refs(w) に入れておく。
dimtype s_instance_refs, vartype("struct")
// ウィンドウ ID w に対応するインスタンスが生きているとき
// s_instance_alive(w) = 1 とする。
dim s_instance_alive
return
// インスタンスが生成されたとき
#modinit
window_id_ = ginfo_newid
// ウィンドウ ID とインスタンスの対応を記録する。
s_instance_alive(window_id_) = 1
// = thismod は NG
// s_instance_refs(window_id_) = thismod
dup s_self, thismod
s_instance_refs(window_id_) = s_self
dim s_self
screen window_id_
title "module screen"
// WM_LBUTTONDOWN
oncmd gosub *l_l_button_down, 0x201
return
// インスタンスが破棄されたとき
#modterm
// インスタンスが破棄されたことを記録する。
s_instance_alive(window_id_) = 0
s_instance_refs(window_id_) = s_nullmod
// (サンプル用) 破棄されたことを分かりやすくするため。
gsel window_id_
boxf
return
#modfunc showid
dialog window_id_
return stat
// 左クリックされたとき
*l_l_button_down
s_window_id = ginfo_act
// このウィンドウ ID に対応するインスタンスが生きているか確認する。
if s_window_id < 0 || s_window_id >= length(s_instance_alive) {
return
}
if s_instance_alive(s_window_id) == 0 {
return
}
// assert varuse(s_instance_refs(s_window_id)) == 1
// クリック時の処理:
showid s_instance_refs(s_window_id)
return stat
#global
init@m_mywin
// ここまでモジュール
// -----------------
// ここからアプリ
repeat 3
newmod w, m_mywin
loop
delmod w(1)
ウィンドウ ID が使えないときは適当に ID を割り振ります。
oncmd でラベルが呼ばれたとき、その割り振った ID をどう探すかは場合によります。
> 通常のボタンやコンボボックスといったコントロールも、
> ウィンドウプロシージャからは送信元のウィンドウハンドルまでしか分からないはずですが、
> この辺のメッセージ処理はどうやって個別に処理しているんでしょうか。
ボタンを作る際に識別子を設定しておくと WM_COMMAND でその識別子ももらえるので、
それで判別するみたいです。
参考: C++ + Win32API でボタンを使う方法の説明記事
[ボタン](
http://wisdom.sakura.ne.jp/system/winapi/win32/win51.html)