我有以下 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
对话中不会收到消息。
我希望我的解释足够清楚。
设置钩子会以如此戏剧性的方式影响行为,这似乎很奇怪。
你们之前有没有遇到过这种问题?