最近、簡潔さとヘッダだけで動く手軽さ、動作の速さに出力バイナリの小ささから、
ATL/WTLに若干ハマっている。
WM_SIZEを処理するとCDialogResizeが動かないという
初歩的すぎるミスを犯したのでメモメモ。
CDialogResizeが動かない動かないと悩んだ末、
メッセージマップでWM_SIZEと、CDialogResizeへのチェインの順番を逆にしたら、
WM_SIZEが動かなくなり、CDialogResizeが動いたことでようやく気づいた。
メッセージマップのCOMMAND_ID_HANDLERで呼び出されるメッセージハンドラ関数の戻り値は、
正常に終了した場合は0を返すというだけで、
1を返したからと言って、メッセージ処理が続けられるわけではないのだ。
当たり前のことだが、すっかり忘れていた…
ハンドラ関数
LRESULT MessageHandler( UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL& bHandled);
の、bHandledをFALSEにしてやらなければならない訳だ。
つまり、
WM_SIZEのハンドラ関数(OnSizeとか)の呼び出し
↓
bHandledをFALSE
↓
CDialogResizeへのチェイン
BEGIN_MSG_MAP(CMainDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize)
CHAIN_MSG_MAP(CDialogResize<CMainDlg>)
END_MSG_MAP()
/*中略*/
LRESULT MessageHandler( UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL& bHandled) {
/*処理*/
bHandled = FALSE;
return 0;
}
という手順が正しい。
ATLの基礎の基礎ながら、解決にすっかり時間がかかってしまった…