ついうっかり罠にはまってしまった。
ウィンドウズではイベントで関数が呼び出されるので、関数の処理される順番が必ず期待通りになるとは限らないという罠。
具体的にはOnInitDialog() よりもOnEnChangeEdit() が実行されうるということと、実行順序は Debug と Release で同一とは限らないということ。
単純に考えると、OnInitDialog() がまず実行され、その後エディットボックスに何か入力されればその都度 OnEnChangeEdit() が呼び出されそうである。
そこで、
BOOL someDlg::OnInitDialog()
{
SetDlgItemInt(IDC_EDIT1, m_foo);
}void someDlg::OnEnChangeEdit()
{
m_foo = GetDlgItemInt(IDC_EDIT1);
}
とうかつに書いたりすると初めに OnEnChangeEdit() が実行されてで m_foo が0になってしまい、OnInitDialog() でえでぃとっボックスに初期値を表示させようとしても実現できない。
someDlg::someDlg() { m_init = false; }とでもしてこの罠を回避する必要がある。 MFC のDDX 使っていれば気にする必要のないことなんだろうけどATL/WTL を使おうとすると要注意かもしれない。BOOL someDlg::OnInitDialog()
{
SetDlgItemInt(IDC_EDIT1, m_foo);
m_init = true;
}void someDlg::OnEnChangeEdit()
{
if (!m_init) return;
m_foo = GetDlgItemInt(IDC_EDIT1);
}