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 に答える