在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
?我似乎没有任何内存泄漏。
答案 0 :(得分:3)
当你有一个由MFC处理的窗口时,你必须分开。第一个是窗口本身(由HWND
表示),第二个是MFC中包含功能实现消息映射的对象,并通过包装Windows消息提供简单的成员函数访问。
调用DestroyWindow
时窗口的生命周期结束。像对话框这样的父窗口会自动销毁所有子窗口。如果孩子是通过调用CreateDialog
/ DoModal
创建的,或者稍后使用任何其他Create方法创建的,则无关紧要。
最后,当进程结束时,所有窗口都会被销毁。事实上,线程结束时,线程内创建的所有窗口都会被销毁。但是在线程结束之前,用户应该销毁窗口。
MFC内存块是另一回事。一些MFC窗口被设计为在堆栈上或作为成员的窗口类内部分配。
通常创建为子窗口(静态,列表视图,按钮等)的对话框和所有窗口都在堆栈上创建,或者作为另一个窗口类中的成员创建。
当调用类的析构函数并且窗口仍然存在时,所有这些窗口都设计为存在于堆栈中或作为成员调用DestroyWindow
。这也会在调试输出上产生一条消息,通常应该避免这种情况。
在堆上创建框架窗口和视图。在堆上创建的所有MFC窗口都具有PostNcDestroy
函数,在处理WM_DESTROY
时最终删除MFC内存块。始终从PostNcDestroy
处理程序调用{{1}}。
您也可以在MSDN中的TN017
中找到有关此内容的详细信息