부모창의 클래스 선언부에서 아래와 같이 포인트 변수를 추가해야한다.
public:
 CChildDlg *m_pDlg;

어떠한 버튼을 클릭하면 모달리스 창을 띄우는데..
주의할것은 NULL 체크를 하지 않으면 새로운 창이 여러개 생긴다는 것이다.


void CModalessDlg::OnBnClickedShowDialog()
{
 // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 if(m_pDlg != NULL)
  m_pDlg->SetFocus();
 else {
  m_pDlg = new CChildDlg;
  m_pDlg->Create(IDD_CHILD_DIALOG);
  m_pDlg->ShowWindow(SW_SHOW);
 }
}

이렇게 하면.. 생성은 된다.
하지만 모달리스는 힙에 생성되기 때문에 메모리에서 소멸을 시켜주지 않으면 메모리 누수가 발생한다.
따라서 아래의 코드가 필수적이다.

void CChildDlg::OnBnClickedExit()
{
 // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 DestroyWindow();
}

이렇게하면 모달리스로 생성된 자식창은 한번은 닫기지만 두번째 생성은 불가능하다.
이미 부모창에서 생성시킨 포인터 변수를 초기화 못했기 때문이다.
그럼 또 아래와 같은 코드가 필요하다.

void CChildDlg::PostNcDestroy()
{
 // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
 CDialog::PostNcDestroy();
 
 CModalessDlg *pMainWnd = (CModalessDlg *)AfxGetMainWnd();
 pMainWnd->m_pDlg = NULL;
 delete this; 
}


부모창을 호출해서 m_pDlg 를 초기화 하고.  자신을 delete 시켜준다.
만약 CModalessDlg 를 참조하기 위해 부모헤더 참조하였다면 에러가 발생할수 있다.
그러면 '전방참조' 라는 글을 참조하기 바란다.
Posted by +깡통+