0

我有一个相当大的应用程序,它显示了许多不同的 MFC CDialog 派生对话框窗口。所有的对话框都显示在一个与此类似的中心功能中:

void ShowDialog(CDialog& dlg)
{
  dlg.DoModal();
}

现在我需要在每个对话框的 OnInitDialog 方法中调用一个函数。它在技术上不需要在 OnInitDialog 中,但最好在对话框可见之前。

蛮力方法是遍历代码并找到每个最后一个对话框并将函数调用添加到 OnInitDialog 方法(如果有,如果没有,添加一个)。但似乎必须有一种更优雅的方式......

请注意,dlg 实际上不是 CDialog,而是从它派生的东西。

有什么想法、技巧或技巧吗?我不是在修补消息映射,但希望找到更清洁/更安全的东西。

4

2 回答 2

1

如果您的所有对话框都有一个共同的祖先,您似乎暗示您有,那么您可以简单地将代码放在该共同祖先中您选择的合适位置。例如OnInitDialog()是虚拟的。

于 2011-03-10T18:47:12.643 回答
-1

事实证明这很容易做到:

HHOOK gPrevHook = SetWindowsHookEx(WH_CALLWNDPROCRET, HookProc, NULL, myGUIThreadID);


LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(NULL != wParam)
    {
         CWPRETSTRUCT* pS = (CWPRETSTRUCT*)lParam;
         if(WM_INITDIALOG == pS->message)
             CallFuncOnWindow(pS->hwnd);
    }

    return CallNextHookEx(gPrevHook, nCode, wParam, lParam);
}

可能不是高性能应用程序要做的事情,但对于一个简单的 GUI 来说,它可以完美运行。无需其他代码更改。

于 2011-03-12T21:53:16.260 回答