Siech0
Siech0

Reputation: 522

MFC: Freezing on dialog SetParent()

Note: Using SetParent freeze the parent window exists, but does NOT seem to be related to this problem as its in an entirely different framework, in a different language, and seems to be an issue with the message pump (though the message pump here could be the problem, I dont think any solution directly helps the problem I am facing here)

I am trying to create a dialog in MFC and attaching it to a parent window as a modeless dialog. My first attempt at this looks like the following:

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

This results in the child dialog spawning in the top left corner of the my screen. I assumed that this was because the child dialog didn't associate itself with the parent for some reason. To fix this, I updated the following code segment.

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

This positions the dialog correctly, but immediately freezes the program.

Upvotes: 0

Views: 411

Answers (1)

Vlad Feinstein
Vlad Feinstein

Reputation: 11311

When you create Dialog resource, it has WS_POPUP style by default. To make it a child of another window, it has to be WS_CHILD.

You can either fix it in your resource file (easy), or, if you use that template elsewhere as a modal dialog, modify its style at run time using ModifyStyle

Upvotes: 1

Related Questions