WM_SIZEをハンドルしないCDialogResizeを作る

Pocket

前回突然オーバーライドと隠ぺいの話をしたのは、
今回の話につなげるため。

CDialogResizeは便利だが、
チェインを使ってコレを処理してしまうと、
その後にWM_SIZEの処理をすることができなくなってしまう。
(チェインする前に捕まえて、 bHadled=FALSE することは可能)

じゃあCDialogResizeを継承して、処理した後にreturnしないようにすればよいのだが、
OnSize関数は仮想関数ではないので、書き換えることができない。

ところが、そのOnSizeを呼んでいるメッセージマップの実態である、
ProcessWindowMessage関数は、(BEGIN_MSG_MAPマクロの中身)
チェインからのみで、CDialogResize内部からは呼ばれていないので、
これを隠ぺいしてしまえば、CDialogResizeのProcessWindowMessageは呼ばれない。

つまり、WM_SIZEを捕まえてもreturnしないProcessWindowMessageを書けばいいのだ。

言うのは簡単だが、書くのも簡単だ

#pragma once
#include <atlframe.h>

template <class T>
class CDialogResizeNoHandle : public CDialogResize<T> {
public:
// Message map and handlers
    BEGIN_MSG_MAP(CDialogResize)
    //MESSAGE_HANDLER(WM_SIZE, OnSize)
    if(uMsg == WM_SIZE)
    {
        lResult = OnSize(WM_SIZE, wParam, lParam, bHandled);
        // no "return TRUE;"
    }
#ifndef _WIN32_WCE
    MESSAGE_HANDLER(WM_GETMINMAXINFO, OnGetMinMaxInfo)
#endif // _WIN32_WCE
    END_MSG_MAP()
};

でおk。

これで、自分でWM_SIZEを処理するコントロールへのサブクラスとしても使ったりできるし、
子ウィンドウのサイズを変更した後、そのサイズを使って他の処理をすることもできる。
(例えば、タブのサイズを変更した後、そのタブに子ウィンドウをアジャストするとか)

コメントを残す

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

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