首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我必须销毁对话框中手动创建的组合框吗?

我必须销毁对话框中手动创建的组合框吗?
EN

Stack Overflow用户
提问于 2017-10-15 08:45:11
回答 1查看 81关注 0票数 1

OnInitDialog中,我调用此方法创建9个CComboBox下拉列表:

代码语言:javascript
复制
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?我似乎没有任何记忆泄露。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-16 08:13:37

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

当调用DestroyWindow时,窗口的生存期结束。父窗口(如对话框)将自动销毁所有it子窗口。无论是通过调用CreateDialog/DoModal来创建子节点,还是稍后使用任何其他Create方法创建子节点,都无关紧要。

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

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

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

此外,当类的析构函数被调用时,以及如果窗口仍然存在,所有这些窗口都被设计为驻留在堆栈上或作为成员调用DestroyWindow。这也会导致调试输出上的消息,通常应该避免这一点。

在堆上创建框架窗口和视图。堆上创建的所有MFC窗口都有一个PostNcDestroy函数,在处理MFC内存块时,该函数将最终删除MFC内存块。PostNcDestroy总是从WM_NCDESTROY处理程序调用的。

您也可以在MSDN的TN017中找到有关这方面的详细信息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46753285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档