首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >截取CDialog创建

截取CDialog创建
EN

Stack Overflow用户
提问于 2011-03-11 01:25:48
回答 2查看 182关注 0票数 0

我有一个相当大的应用程序,可以显示许多不同的从MFC CDialog派生的对话框窗口。所有对话框都显示在一个类似于以下内容的中心函数中:

代码语言:javascript
复制
void ShowDialog(CDialog& dlg)
{
  dlg.DoModal();
}

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

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

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

有什么想法、窍门或技巧吗?我并不是在修补消息地图,但希望能找到一些更干净/更安全的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-13 05:53:16

事实证明,这很容易做到:

代码语言:javascript
复制
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来说,它可以完美地工作。不需要更改其他代码。

票数 -1
EN

Stack Overflow用户

发布于 2011-03-11 02:47:13

如果您的所有对话框都有一个共同的祖先,那么只需将代码放在该共同祖先中的适当位置即可。例如,OnInitDialog()是虚拟的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5263374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档