次の MFC アプリケーション UI 構造があります。
Main Frame
- CView derived class
- CWnd derived class
--- CMFCTabCtrl derived class
---- CDialog derived class
CMFCTabCtrl は、CWnd 派生クラスなどを順番に保持できます...
これをウィンドウのツリーと考える場合は、上記を深さ 0 に定義してみましょう。
この問題は、ツリーの深さが 1 の場合に発生します。つまり、次の場合です。
Main Frame
- CView derived class
- CWnd derived class
--- CMFCTabCtrl derived class
----- CWnd derived class
------- CMFCTabCtrl derived class
-------- CDialog derived class
アプリケーションに次のコードを追加しました。
extern HHOOK hHook = nullptr;
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(hook, nCode, wParam, lParam);
}
hHook = SetWindowsHookEx(WH_CALLWNDPROC, &HookProc, AfxGetInstanceHandle(), GetCurrentThreadId());
次に、アプリケーションを実行してメイン フレームのサイズを変更したところ、次のことがわかりました。
- ツリーの深さが 0 の場合、
WM_ERASEBKGND
メッセージはダイアログで受信されます。 - ツリーの深さが 1 の場合、
WM_ERASEBKGND
メッセージはダイアログで受信されません。
私の説明が十分に明確であることを願っています。
フックを設定すると、動作が劇的に変化するのは奇妙に思えます。
以前にこの種の問題に遭遇した人はいますか?