前回はinputの値が変更されたことを検出しましたが、
今回は調子に乗って色々なオブジェクトの値の変化を検出してみようと思います。
やっていることは基本的に同じで、ウインドウに送られてきたWM_COMMANDメッセージを処理しているだけです。
ただし、前回はEN_CHANGEで値が変更されたことを検出していましたが、これはinputやmesbox用(他にもありますが・・・)なので、comboxやlistboxなどについては別のコードを使用して検出します。
とりあえずソースコードです
#define ctype HIWORD(%1) ((%1>>16)&0xffff) // 上位ワードを返す
#define ctype LOWORD(%1) (%1&0xffff) // 下位ワードを返す
#define WM_COMMAND $00000111
#define EN_CHANGE $00000300
#define CBN_SELCHANGE $00000001
#define LBN_SELCHANGE $00000001
#define BN_CLICKED $00000000
#define LB_GETCURSEL $00000188
oncmd gosub *onWM_COMMAND,WM_COMMAND
// combox ---------------------------------------
mes "combox:"
objsize 100,24
combox cbox,200,"combox0\ncombox1\ncombox2\ncombox3"
hCombox = objinfo(stat,2)
// input ----------------------------------------
mes "\ninput:"
sdim iput,64,1
input iput,200,24,10
hInput = objinfo(stat,2)
// mesbox ---------------------------------------
mes "\nmesbox:"
sdim mbox,64,1
mesbox mbox,200,100,1
hMesbox = objinfo(stat,2)
// chkbox ---------------------------------------
mes "\nchkbox:"
chkbox "chkbox",chbox
hChkbox = objinfo(stat,2)
// listbox --------------------------------------
mes "\nlistbox:"
listbox lbox,64,"listbox0\nlistbox1\nlistbox2\nlistbox3"
hListbox = objinfo(stat,2)
font msgothic,12
pos 250,10
stop
// メッセージ処理 -----------------------------------------
*onWM_COMMAND
switch lParam
// combox -----------------------------------------
case hCombox
if HIWORD(wParam) == CBN_SELCHANGE {
color 200,0,0
mes "comboxの内容が変更されました["+cbox+"]"
}
swbreak
// input ------------------------------------------
case hInput
if HIWORD(wParam) == EN_CHANGE {
color 0,200,0
mes "inputの内容が変更されました["+iput+"]"
}
swbreak
// mesbox -----------------------------------------
case hMesbox
if HIWORD(wParam) == EN_CHANGE {
color 0,0,200
mes "mesboxの内容が変更されました["+mbox+"]"
}
swbreak
// chkbox -----------------------------------------
case hChkbox
if HIWORD(wParam) == BN_CLICKED {
color 0,200,200
mes "chkboxの内容が変更されました["+chbox+"]"
}
swbreak
// listbox ----------------------------------------
case hListbox
if HIWORD(wParam) == LBN_SELCHANGE {
color 200,0,200
sendmsg hListbox, LB_GETCURSEL :lbox = stat // 現在選択されているインデックスを取得
mes "listboxの内容が変更されました["+lbox+"]"
}
swbreak
swend
return
|
色々オブジェクトを設置したので長ったるくなっていますが、同じようなことを繰り返しているだけです。
まず各々のオブジェクトを設置し、オブジェクトのハンドルをobjinfo命令で取得しておきます。
次に肝心のメッセージ処理の部分ですが、inputの値の変化を検出したときと同じようにWM_COMMANDを処理しています。
ただ今回はEN_CHANGEだけではなく、オブジェクトの種類ごとに別々のコードを使用することになります。
オブジェクトごとのコードは以下のようになっています
input :EN_CHANGE ($00000300)
mesbox :EN_CHANGE ($00000300)
combox :CBN_SELCHANGE ($00000001)
listbox :LBN_SELCHANGE ($00000001)
chkbox :BN_CLICKED($00000000) |
これらのコードを使って変化を検出します。
前回のinputの値の変化を検出したときと同じように、lParamと、取得しておいたオブジェクトハンドルを比較し、一致したらwParamの上位ワードを調べます。
wParamにオブジェクトごとのコード、inputならEN_CHANGE、comboxならCBN_SELCHANGEが入っているかどうか調べ、入っていれば値が変更されたということになります。
あと後半のlistboxの処理のところに
sendmsg hListbox, LB_GETCURSEL :lbox = stat
といった記述がありますが
これは選択されているインデックスがうまく取得できなかったので、その対策として入れた処理です。
参照
Let's HSP! HSP3 あれこれ <オブジェクト編 4>:
http://lhsp.s206.xrea.com/hsp_object4.html
メッセージの調査に使ったツール
Winspector - Ultimate Programmers Window Spy Utility:
http://www.windows-spy.com/
|