[MFC] DoModal, Modeless 생성 및 차이

DoModal

부모 대화상자가 자식 대화상자를 호출 하고에 자식 대화상자의 작업이 종료될 때 까지 대기합니다.
자식 대화상자가 종료되지 않으면 부모 대화상자에 포커스도 설정되지 않습니다.
자식 대화상자가 종료되어야 다음 작업을 수행합니다.

Modeless

자식 대화상자의 호출과 관련없이 다음 작업을 수행합니다.
자식 대화상자를 여러개 호출 가능하며, 프로그래머가 해제도 해야합니다.


우선 프로젝트 생성을 통해 DoModal과 Modeless를 만들어 보도록 하겠습니다.
MFC 프로젝트 생성 후(부모창 생성), 추가 -> 클래스를 눌러 MFC 클래스(자식 창)를 추가하도록 합니다. 

그런 다음 아래와 같이 입력하여 생성해줍니다.

위 작업을 정상적으로 완료하면 클래스와 대화상자 리소스가 추가됩니다.
확인 후 대화 상자 구별을 위해 아래와 같이 리소스를 수정합니다.

부모 대화상자에 DoModal과 Modeless 버튼을 추가하고 더블 클릭하여 이벤트 처리 함수를 생성해줍니다.

대화상자 헤더파일에 TestDlg.h 를 include 하시고, 멤버변수를 아래와 같이 만듭니다.

// 헤더파일 include
#include "TestDlg.h"

// ...

// 멤버 변수
CTestDlg *m_pTestDlg;

OnBnClickedButtonDomodal 함수에 아래와 같이 코딩합니다.

void CMFCApplication1Dlg::OnBnClickedButtonDomodal()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CTestDlg dlgTest;
	int iRes = dlgTest.DoModal(); // 자식 대화상자 생성, 부모 대화상자 정지
	if ( IDOK == iRes )
	{
		// 확인 버튼 눌렀을 때
	}
	else if ( IDCANCEL == iRes )
	{
		// 취소 버튼 눌렀을 때
	}
}

빌드후 실행하셔서 버튼을 눌러 보면 아래와 같이 작동합니다.

OnBnClickedButtonModeless 함수에 아래와 같이 코딩합니다.

void CMFCApplication1Dlg::OnBnClickedButtonModeless()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	m_pTestDlg = new CTestDlg;
	m_pTestDlg->Create( IDD_TESTDLG );
	m_pTestDlg->ShowWindow( SW_SHOW );

	// ** 사용이 완료되면 프로그래머가 해제를 해줘야한다.
// 	m_pTestDlg->DestroyWindow();
// 	m_pTestDlg = NULL;
}

빌드후 실행하셔서 버튼을 눌러 보면 아래와 같이 작동합니다.

참고로 OnBnClickedButtonModeless에서 제가 CTestDlg를 생성하고 정리하는 것은 주석 처리하였습니다.
꼭 생성한 자식 대화상자는 부모 대화상자가 종료될 때 정리 해주셔야 메모리 릭이 발생되지 않습니다.
자바와 달리 C++은 Garbage Collection이 없으므로 유의하시길 바랍니다.