MFC:在对话框 SetParent() 上冻结

MFC: Freezing on dialog SetParent()

注意:Using SetParent freeze the parent window 存在,但似乎与此问题无关,因为它在完全不同的框架中,使用不同的语言,并且似乎是消息泵的问题(尽管这里的消息泵可能是问题所在,我认为任何解决方案都不能直接帮助解决我在这里面临的问题)

我正在尝试在 MFC 中创建一个对话框并将其作为无模式对话框附加到父 window。我的第一次尝试如下所示:

    // Add window to the segment dialog vector
    m_segmentDialogs.emplace_back(std::make_unique<DlgSegmentDatum>(this));
    const int tab_number = m_segmentDialogs.size() - 1;

    std::string tab_text = "Segment " + std::to_string(tab_number);
    m_tabSegments.InsertItem(tab_number, tab_text.c_str());

    // Initialize the new dialog
    auto& dlg = m_segmentDialogs.back();
    dlg->Create(IDD_DIALOG_SEGMENT_DATUM, this);

    CRect rc_client, rc_window;
    m_tabSegments.GetClientRect(&rc_client);
    m_tabSegments.AdjustRect(FALSE, &rc_client);

    m_tabSegments.GetWindowRect(&rc_window);
    ScreenToClient(rc_window);

    rc_client.OffsetRect(rc_window.left, rc_window.top);

    dlg->MoveWindow(&rc_client);

    displaySegmentTab(tab_number);

这会导致在我的屏幕左上角生成子对话框。我认为这是因为子对话框出于某种原因没有将自己与父对话框相关联。为了解决这个问题,我更新了以下代码段。

    // Initialize the new dialog
    auto& dlg = m_segmentDialogs.back();
    dlg->Create(IDD_DIALOG_SEGMENT_DATUM, this);
    dlg->SetParent(this);

这会正确定位对话框,但会立即冻结程序。

当您创建对话框资源时,它默认具有 WS_POPUP 样式。要使其成为另一个 window 的 child,它必须是 WS_CHILD

您可以在资源文件中修复它(简单),或者,如果您在其他地方将该模板用作模态对话框,请在 运行 时使用 ModifyStyle[=13 修改其样式=]