프로그래밍/MFC
모달리스 대화상자 띄우기
+깡통+
2009. 1. 18. 23:46
부모창의 클래스 선언부에서 아래와 같이 포인트 변수를 추가해야한다.
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 를 참조하기 위해 부모헤더 참조하였다면 에러가 발생할수 있다.
그러면 '전방참조' 라는 글을 참조하기 바란다.
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 를 참조하기 위해 부모헤더 참조하였다면 에러가 발생할수 있다.
그러면 '전방참조' 라는 글을 참조하기 바란다.