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

Pocket

最近、簡潔さとヘッダだけで動く手軽さ、動作の速さに出力バイナリの小ささから、
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の基礎の基礎ながら、解決にすっかり時間がかかってしまった…

コメントを残す

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

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