【问题标题】:MFC: Freezing on dialog SetParent()MFC:在对话框 SetParent() 上冻结
【发布时间】:2021-01-22 18:25:03
【问题描述】:

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

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

    // 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);

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

【问题讨论】:

  • 我可能弄错了,但看起来dlg-&gt;SetParent(this); 正在将this 设置为它自己的父级,因为this 之前已在同一代码块中添加到m_segmentDialogs 向量中。跨度>
  • @DaveRager en.cppreference.com/w/cpp/memory/unique_ptr/make_unique。这作为参数传递给段类的构造函数。

标签: windows winapi mfc


【解决方案1】:

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

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

【讨论】:

  • 我以前试过这个,但没有成功。当我早些时候尝试修复此问题时,我遇到了类似 dlg->ModifyStyles(WS_POPUP, WS_CHILD) 的内容。我检查了我的资源,资源本身已经设置了 WS_CHILD。
  • @Siech0 - 请从您的资源文件中发布整个样式行。这在我的测试应用程序中运行良好;当我将样式从 WS_POPUP 更改为 WS_CHILD 时,第二个对话框的位置从屏幕的 (0,0) 更改为客户区。我看到您正在使用某种“选项卡” - 可能该对话框应该是该选项卡的子级?
  • 整体代码现在看起来有点不同,但更改为使用选项卡控件作为父控件似乎有所帮助。定位似乎仍然错误,但我想我也已经解决了。谢谢。
  • 还要确保正确设置DS_CONTROLWS_EX_CONTROLPARENT 样式。否则键盘导航将无法按预期工作。详情请见What is the DS_CONTROL style for?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多