首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对话框SetParent()冻结

对话框SetParent()冻结
EN

Stack Overflow用户
提问于 2020-10-08 02:20:14
回答 1查看 93关注 0票数 0

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

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

代码语言:javascript
复制
    // 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);

这会导致子对话框出现在my screen的左上角。我认为这是因为子对话框由于某种原因没有与父对话框相关联。为了解决这个问题,我更新了下面的代码段。

代码语言:javascript
复制
    // Initialize the new dialog
    auto& dlg = m_segmentDialogs.back();
    dlg->Create(IDD_DIALOG_SEGMENT_DATUM, this);
    dlg->SetParent(this);

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-08 02:38:15

创建对话框资源时,默认为WS_POPUP样式。要使它成为另一个窗口的子级,它必须是WS_CHILD

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

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

https://stackoverflow.com/questions/64250097

复制
相关文章

相似问题

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