WM_SIZEを処理するとCDialogResizeが動かない?

Pocket

最近、簡潔さとヘッダだけで動く手軽さ、動作の速さに出力バイナリの小ささから、
ATL/WTLに若干ハマっている。

WM_SIZEを処理するとCDialogResizeが動かないという
初歩的すぎるミスを犯したのでメモメモ。

CDialogResizeが動かない動かないと悩んだ末、
メッセージマップでWM_SIZEと、CDialogResizeへのチェインの順番を逆にしたら、
WM_SIZEが動かなくなり、CDialogResizeが動いたことでようやく気づいた。

メッセージマップのCOMMAND_ID_HANDLERで呼び出されるメッセージハンドラ関数の戻り値は、
正常に終了した場合は0を返すというだけで、
1を返したからと言って、メッセージ処理が続けられるわけではないのだ。
当たり前のことだが、すっかり忘れていた…

ハンドラ関数
[cc lang=”c++” line_numbers=”false”]
LRESULT MessageHandler( UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL& bHandled);
[/cc]
の、bHandledをFALSEにしてやらなければならない訳だ。

つまり、
WM_SIZEのハンドラ関数(OnSizeとか)の呼び出し

bHandledをFALSE

CDialogResizeへのチェイン
[cc lang=”c++” line_numbers=”false”]
BEGIN_MSG_MAP(CMainDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
MESSAGE_HANDLER(WM_SIZE, OnSize)
CHAIN_MSG_MAP(CDialogResize)
END_MSG_MAP()
/*中略*/
LRESULT MessageHandler( UINT uMsg, WPARAM wParam,
LPARAM lParam, BOOL& bHandled) {
/*処理*/
bHandled = FALSE;
return 0;
}
[/cc]
という手順が正しい。

ATLの基礎の基礎ながら、解決にすっかり時間がかかってしまった…

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください