前回突然オーバーライドと隠ぺいの話をしたのは、
今回の話につなげるため。
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を処理するコントロールへのサブクラスとしても使ったりできるし、
子ウィンドウのサイズを変更した後、そのサイズを使って他の処理をすることもできる。
(例えば、タブのサイズを変更した後、そのタブに子ウィンドウをアジャストするとか)