【问题标题】:MFC nesting dialog boxes beyond 1 level超过 1 层的 MFC 嵌套对话框
【发布时间】:2017-12-28 09:47:53
【问题描述】:

我正在尝试嵌套对话框,它可以毫不费力地使用单级嵌套,但第二级“中断” - 最里面的对话框没有事件。

[IDD_NESTEDDLG_DIALOG]
   |
   +--- [IDD_CHILD1]
            |
            +--- [IDD_CHILD2]

两个子对话框的样式都设置为“子”。对于这个测试,我只是使用了一个直接的 MFC 向导:创建了一个基于对话框的应用程序,添加了两个子对话框(都派生自 CDialogEx),添加了成员​​变量来保存这些子对话框的实例。除了创建子对话框并在OnInitDialog() 中显示它们之外,没有任何自定义:

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;
}

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

我觉得这里缺少一些非常微不足道的东西,但是玩了几个小时的各种设置(“控制”、“控制父级”、“无空闲消息”、“无父级通知”)并在网络上搜索没有进展至今。

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

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

【问题讨论】:

  • 显示实际调用嵌套对话的代码。如果您想要嵌套对话但又想与父对话交互,那么它们都必须是无模式对话。您不能同时有两个模型弹出窗口,因为第一个会阻止所有消息。
  • 它们不是弹出窗口,它们是子对话框(相互放置,就像套娃娃娃)。 “实际调用的代码”已经列出 - 除了调用 Create()ShowWindow()
  • 必须为嵌入在对话框中的子对话框设置 Control 和 Child。
  • 刚刚尝试过(在两个子对话框上同时设置 Control 和 Child)- 相同的否定结果。

标签: mfc dialog


【解决方案1】:

根据我从您的帖子中收集到的信息,您将两个对话框都创建为主对话框的子对话框,并且对话框位于另一个之上。 除了设置 WS_CHILD 和 DS_CONTROL,您还必须将指针传递给父级。 因此,第一个对话框是主对话框的孩子,第二个是第一个嵌套的孩子。 可能是 WS_CLIPCHILDREN 来消除您提到的重绘问题,但这无关紧要,因为您不会四处移动对话框。 我写了一个样例你可以下载HERE

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

【讨论】:

  • 你是对的!一切都是为了正确设置 parent
猜你喜欢
  • 2023-02-08
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
相关资源
最近更新 更多