MFC嵌套对话框超出1级

MFC嵌套对话框超出1级,mfc,dialog,Mfc,Dialog,我正在尝试嵌套对话框,它可以轻松地嵌套一个级别,但是第二个级别“中断”——最内部的对话框不会得到事件 [IDD_NESTEDDLG_DIALOG] | +--- [IDD_CHILD1] | +--- [IDD_CHILD2] 两个子对话框的样式都设置为“子”。对于这个测试,我只是使用了一个简单的MFC向导:创建了一个基于对话框的应用程序,添加了两个子对话框(都来自CDialogEx),添加了成员变量来保存这些子对话框的实例。除了创建

我正在尝试嵌套对话框,它可以轻松地嵌套一个级别,但是第二个级别“中断”——最内部的对话框不会得到事件

[IDD_NESTEDDLG_DIALOG]
   |
   +--- [IDD_CHILD1]
            |
            +--- [IDD_CHILD2]
两个子对话框的样式都设置为“子”。对于这个测试,我只是使用了一个简单的MFC向导:创建了一个基于对话框的应用程序,添加了两个子对话框(都来自
CDialogEx
),添加了成员变量来保存这些子对话框的实例。除了创建子对话框并在
OnInitDialog()中显示它们之外,没有其他自定义项:

当我运行这段代码时,两个嵌套对话框都会正确显示,但只有顶级和一级对话框会获取事件。单击
IDD_CHILD1
的“确定”或“取消”按钮立即关闭该中间对话框,只有之后,最内部的子对话框开始获取事件

我觉得我在这里遗漏了一些非常琐碎的东西,但数小时的各种设置(“控制”、“控制家长”、“无空闲消息”、“无家长通知”)和搜索网页至今没有取得任何进展

如何正确嵌套对话框,以便第二级子控件在顶级和第一级对话框控件也处于活动状态时获取事件

更新

一旦我使两个子框都具有“正常”边框,我就能够在顶级对话框中移动它们,并注意到第二级子框感觉更像是第一级对话框的兄弟,而不是它的子框。这个问题可能存在,但我仍然不知道如何正确处理这个问题。重新绘制也有一个问题,因为除非应用程序最小化/恢复或移出屏幕,否则两个子框似乎都无法重新绘制。

根据我从您的帖子中收集的信息,您创建的两个对话框都是主对话框的子对话框,并且对话框的位置都是一个在另一个之上。 除了设置WS_CHILD和DS_控件外,还必须传递一个指向父对象的指针。 因此,第一个对话框是主对话框的子对话框,第二个对话框是第一个嵌套对话框的子对话框。 可能是WS_CLIPCHILDREN消除了您提到的重新绘制问题,但这与此无关,因为您不会移动对话框。 我写了一个可以下载的示例


它有鼠标和按钮处理程序,用于显示您正在接收的消息

显示实际调用嵌套对话的代码。如果您想要嵌套对话,但又想与父对话交互,那么它们都必须是无模式对话。您不能同时拥有两个模型弹出窗口,因为第一个将阻止所有消息。它们不是弹出窗口,而是子对话框(放置在彼此内部,如matreshka dolls)。“实际调用的代码”已经列出-除了调用
Create()
ShowWindow()
控件和子控件外,其他任何内容都必须为嵌入在对话框中的子对话框设置。刚刚尝试(在两个子对话框上同时设置控件和子控件)-相同的否定结果。你说得对!这一切都在于正确地设置家长。
BOOL CnestedDlgDlg::OnInitDialog()
{
    // ... MFC-generated bootstrap

    m_child1.Create(IDD_CHILD1);
    m_child1.ShowWindow(SW_SHOW);

    return TRUE;
}
BOOL CChild1::OnInitDialog()
{
    // ... MFC-generated bootstrap

    m_child2.Create(IDD_CHILD2);
    m_child2.ShowWindow(SW_SHOW);

    return TRUE;
}