我是否必须在对话框中销毁手动创建的组合框?

时间:2017-10-15 08:45:12

标签: mfc

OnInitDialog中,我将此方法称为创建9个CComboBox下拉列表:

void CChristianLifeMinistryStudentsDlg::CreateSampleConversationVideoCombos()
{
    CChristianLifeMinistryStudentEdit* pArrayStudents[9] =
    {
        &m_editMainStudent1,
        &m_editMainStudent2,
        &m_editMainStudent3,
        &m_editClass1Student1,
        &m_editClass1Student2,
        &m_editClass1Student3,
        &m_editClass2Student1,
        &m_editClass2Student2,
        &m_editClass2Student3
    };

    CChristianLifeMinistryStudentEdit* pArrayAssistants[9] =
    {
        &m_editMainStudent1Assist,
        &m_editMainStudent2Assist,
        &m_editMainStudent3Assist,
        &m_editClass1Student1Assist,
        &m_editClass1Student2Assist,
        &m_editClass1Student3Assist,
        &m_editClass2Student1Assist,
        &m_editClass2Student2Assist,
        &m_editClass2Student3Assist
    };

    CString strChairman, strAuxClassCounsellor;

    strChairman.LoadString(IDS_STR_MWB_CHAIRMAN);
    strAuxClassCounsellor.LoadString(IDS_STR_AUX_CLASS_COUNSELLOR);

    for (int i = 0; i < 9; i++)
    {
        CRect rctStudent, rctAssistant;

        pArrayStudents[i]->GetWindowRect(rctStudent);
        pArrayAssistants[i]->GetWindowRect(rctAssistant);

        ScreenToClient(&rctStudent);
        ScreenToClient(&rctAssistant);

        CRect rctSampleConversationVideo;

        rctSampleConversationVideo.SetRect(rctStudent.TopLeft(), rctAssistant.BottomRight());
        m_cbSampleConversationVideo[i].Create(CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE,
            rctSampleConversationVideo, this, IDC_COMBO_OCLM_AYFM_ASSIGN1_MH + i);

        m_cbSampleConversationVideo[i].SetFont(GetFont());
        m_cbSampleConversationVideo[i].AddString(strChairman);
        m_cbSampleConversationVideo[i].AddString(strAuxClassCounsellor);
    }
}

我能解决的问题是,当对话框关闭时,我是否需要在每个上面调用DestroyWindow?我似乎没有任何内存泄漏。

1 个答案:

答案 0 :(得分:3)

当你有一个由MFC处理的窗口时,你必须分开。第一个是窗口本身(由HWND表示),第二个是MFC中包含功能实现消息映射的对象,并通过包装Windows消息提供简单的成员函数访问。

调用DestroyWindow时窗口的生命周期结束。像对话框这样的父窗口会自动销毁所有子窗口。如果孩子是通过调用CreateDialog / DoModal创建的,或者稍后使用任何其他Create方法创建的,则无关紧要。

最后,当进程结束时,所有窗口都会被销毁。事实上,线程结束时,线程内创建的所有窗口都会被销毁。但是在线程结束之前,用户应该销毁窗口。

MFC内存块是另一回事。一些MFC窗口被设计为在堆栈上或作为成员的窗口类内部分配。

通常创建为子窗口(静态,列表视图,按钮等)的对话框和所有窗口都在堆栈上创建,或者作为另一个窗口类中的成员创建。

当调用类的析构函数并且窗口仍然存在时,所有这些窗口都设计为存在于堆栈中或作为成员调用DestroyWindow。这也会在调试输出上产生一条消息,通常应该避免这种情况。

在堆上创建框架窗口和视图。在堆上创建的所有MFC窗口都具有PostNcDestroy函数,在处理WM_DESTROY时最终删除MFC内存块。始终从PostNcDestroy处理程序调用{​​{1}}。

您也可以在MSDN中的TN017

中找到有关此内容的详细信息