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

Pocket

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

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

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

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

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

言うのは簡単だが、書くのも簡単だ
[cc lang=”c++”]
#pragma once
#include

template
class CDialogResizeNoHandle : public CDialogResize {
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()
};
[/cc]
でおk。

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

コメントを残す

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

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