ん?statに値が入る前にだとかはSendMessageなのでそんなこと気にする必要がなく、
実際に選択位置がstatには返っています。
ただ、statに値が入るためには実際にリストボックスの選択変更が成功した後でなくてはならず、
そもそも、リストボックスの選択変更に成功していないんです。
・マウスクリックによって、選択を変更しようとする
→まず、リストボックスはフォーカスを獲得する
→フォーカス獲得によってリストボックスは親へ通知(WM_COMMANDが発生)
→フォーカスが新しくできたウィンドウによって剥奪される(screen2の時点で割り込み #1)
→フォーカス喪失にによって、親ウィンドウへ通知(WM_COMMANDが発生)
→screen2が再生成される(*show終わり)
→(#1)の続きが実行される。(*show終わり)
→クリック動作によって選択を変更しようとしていたリストボックスはフォーカスがないため、
その操作を失敗とする。
>新しくウィンドウが出てくるが、リストボックス選択位置は見た目上も実際の値も変化していない。
!結果として、選択変更によるWM_COMMANDは発生しない。
#define global WM_COMMAND $111
#define global LB_GETCURSEL $188
#define global LBN_SELCHANGE 1
#define global LBN_DBLCLK 2
#define global LBN_SELCANCEL 3
#define global LBN_SETFOCUS 4
#define global LBN_KILLFOCUS 5
#define global ctype LOWORD(%1) ((%1)&0xFFFF)
#define global ctype HIWORD(%1) LOWORD((%1)>>16)
oncmd gosub *show,WM_COMMAND
listbox tmp,100,"a\nb\nc\nd\n"
hListbox = objinfo(stat,2)
pos 160,0 // test-code
stop
*show
// logmes strf("%08X",wparam)
if ( lparam == hListBox ){
// LOWORD(wparam) == 0x4000 + 0(object-id) でも単一ウィンドウならば可能。
// Debug-Area
gsel 0
if ( HIWORD(wparam) == LBN_SELCHANGE ) : mes "選択変更"
if ( HIWORD(wparam) == LBN_DBLCLK ) : mes "ダブルクリック"
if ( HIWORD(wparam) == LBN_SELCANCEL ) : mes "選択キャンセル"
if ( HIWORD(wparam) == LBN_SETFOCUS ) : mes "フォーカス獲得"
if ( HIWORD(wparam) == LBN_KILLFOCUS ) : mes "フォーカス喪失"
// end-Debug-Area
if ( HIWORD(wparam) == LBN_SELCHANGE ){
gsel 0
sendmsg hListbox,$188
title ""+stat
screen 2 ;★
return 0
}
}
return // DefWindowProc()
WM_COMMANDで何かするなら、だれが何の目的で送ったものかを確認しないと。
ちなみに、すでに選択中のものを選んでも選択変更が来るのはリストボックス側の仕様です。
実際に変更されたかどうかは前回値との比較で。