【发布时间】: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->SetParent(this);正在将this设置为它自己的父级,因为this之前已在同一代码块中添加到m_segmentDialogs向量中。跨度> -
@DaveRager en.cppreference.com/w/cpp/memory/unique_ptr/make_unique。这作为参数传递给段类的构造函数。