정리

'Dialog'에 해당되는 글 1건

  1. [MFC] Modaless Dailog - Itself destroy

[MFC] Modaless Dailog - Itself destroy

저장소/VC++
Dialog를 띄우다보면 종종 Modaless로 띄워야 할 경우가 많다.
Modaless로 Dialog를 띄우는 방법은 다음과 같다.
CTestDlg*	m_pDlgTest;

void OpenDlg()
{
	m_pDlgTest = new CTestDlg;
	m_pDlgTest->Create(IDD_TEST_DIALOG, this);
	m_pDlgTest->ShowWindow(SW_SHOWNORMAL);
}
객체를 생성했기 때문에 Dialog가 닫히고나면 반드시 지워줘야 메모리 누수를 방지할 수 있다.
그런데... 종종 잊어버린다. ㅡㅡ; 문제다.

이런 문제를 사전에 방지하기 좋은 방법이 요기있넹~
기완형이 알려주셨던, 창훈형이 다시 알려준 좋은 방법 정리!!!
class CTestDlg : public CDialog
{
	DECLARE_DYNAMICCTestDlg 

public:
	CTestDlg(CTestDlg*& pOwnObjPtr);
	virtual ~CTestDlg();

	BOOL	Create(CWnd* pParentWnd = NULL);

Protected:
	...
	virtual void PostNcDestroy();
	afx_msg void OnClose();
	

private:
	CTestDlg*&	m_pOwnObjPtr;


};

CTestDlg::CTestDlg(CTestDlg*& pOwnObjPtr)
	: CDialog(CTestDlg::IDD, NULL)
	, m_pOwnObjPtr(pOwnObjPtr)
{
}

BOOL CTestDlg::Create(CWnd* pParentWnd)
{
	return CDialog::Create(IDD, pParentWnd);
}

void CTestDlg::PostNcDestroy()
{
	m_pOwnObPtr = NULL;
	delete this;
}

void CTestDlg::Close()
{
	DestoryWindow();
}

////////////////////////////////////////////////////////

CTestDlg*	m_pDlgTest;

void OpenDlg()
{
	m_pDlgTest = new CTestDlg(m_pDlgTest);
	m_pDlgTest->Create(this);
	m_pDlgTest->ShowWindow(SW_SHOWNORMAL);
}
수정이 필요한 부분만 정리했다.
중요 부분은 Constructor 수정, Create 함수 Overload, PostNcDestroy, OnClose 함수를 Override 해줘야 한다.
그리고 자신의 객체를 저장할 변수(CTestDlg*&)를 잡아주면 된다.
Dialog가 종료될 때 반드시 OnClose를 거치지는 않는다. 필요에 따라 손을 좀 봐줘야 한다.

주요 내용은 위와 같으며 요로코롬 해두면 Dialog가 닫힐 때 스스로 자신의 객체를 지우기 때문에 편리하다.
하지만 주의해야 할 것은 Modaless에만 해당된다는 것이다.
이렇게 처리한 Dialog는 Modal로 띄우면 스스로 객체를 지우는 과정 때문에 문제가 발생한다. 아마 그랬던 것 같다.
요령껏 쓰도록 합시다.