[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로 띄우면 스스로 객체를 지우는 과정 때문에 문제가 발생한다. 아마 그랬던 것 같다.
요령껏 쓰도록 합시다.
'저장소 > VC++' 카테고리의 다른 글
[Win32 API] File Information 확인 (1) (0) | 2011.02.22 |
---|---|
[Win32 API] 가변인자 처리 방식, 그리고 오류 (0) | 2011.02.14 |
[MFC] Esc Key 또는 Return Key에 의해 Dialog가 닫힐 때 처리 방법 (0) | 2011.01.26 |
[MFC] OnCancel(), OnClose(), OnDestroy(), OnOK() 그리고 Dialog 소멸자 (0) | 2011.01.04 |
[Win32 API] RegQueryInfoKey (0) | 2010.12.16 |