0

我有以下 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());

然后我运行应用程序并调整主框架的大小,我注意到以下内容:

  1. 在树深度为 0 的情况下,WM_ERASEBKGND在对话中接收到消息。
  2. 在树深度为 1 的情况下,WM_ERASEBKGND对话中不会收到消息。

我希望我的解释足够清楚。

设置钩子会以如此戏剧性的方式影响行为,这似乎很奇怪。

你们之前有没有遇到过这种问题?

4

1 回答 1

0

我想我找到了问题所在。每次我们调整下一个嵌套窗口的大小时,内核堆栈都会增加,直到它没有足够的堆栈来调用 wndproc 并且我们停止接收消息。

更多细节可以在这里找到:http: //blogs.msdn.com/b/alejacma/archive/2008/11/20/controls-won-t-get-resized-once-the-nesting-hierarchy-of-windows -exceeds-a-certain-depth-x64.aspx

于 2013-03-04T14:57:15.337 回答