如何解决MFC:冻结对话框SetParent
注意: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);
这样可以正确放置对话框,但是会立即冻结程序。
解决方法
创建对话框资源时,默认情况下它具有WS_POPUP
样式。要使其成为另一个窗口的子级,必须为WS_CHILD
。
您可以轻松地在资源文件中修复它,或者,如果您在其他地方将该模板用作模式对话框,则可以在运行时使用ModifyStyle
修改其样式。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。