我有一个相当大的应用程序,可以显示许多不同的从MFC CDialog派生的对话框窗口。所有对话框都显示在一个类似于以下内容的中心函数中:
void ShowDialog(CDialog& dlg)
{
dlg.DoModal();
}现在我需要在每个对话框的OnInitDialog方法中调用一个函数。从技术上讲,它不需要在OnInitDialog中,但最好在对话框可见之前。
暴力方法是遍历代码,找到最后一个对话框,并将函数调用添加到OnInitDialog方法(如果它有,如果没有,则添加一个)。但似乎一定有一种更优雅的方式...
请注意,dlg实际上不是一个CDialog,而是从它派生出来的东西。
有什么想法、窍门或技巧吗?我并不是在修补消息地图,但希望能找到一些更干净/更安全的东西。
发布于 2011-03-13 05:53:16
事实证明,这很容易做到:
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-11 02:47:13
如果您的所有对话框都有一个共同的祖先,那么只需将代码放在该共同祖先中的适当位置即可。例如,OnInitDialog()是虚拟的。
https://stackoverflow.com/questions/5263374
复制相似问题