1. Modal 과 Modeless
Modal은 대화상자가 출력되고 있는 동안 프로그램의 모든 제어권을 독점하고 있어 대화상자가 종료되기
전까지 다른 작업을 할 수가 없다.
Modeless는 대화상자가 출력되고 있는 동안에도 다른 작업을 할 수가 있다.
2. 대화상자 출력시 차이점
구분 |
Modal |
Modeless |
생성 |
DoModal |
Create |
종료 |
EndDialog |
DestroyWindow |
인스턴스 선언 |
지역변수 |
동적할당 |
- Modeless는 DoModal 함수로 생성된 것이 아니기 때문에 EndDialog를 사용할 수 없다.
- IDOK 또는 IDCANCEL 같은 ID를 가진 버튼을 만들지 않는 것이 좋으며 꼭 이 버튼을
추가해야 할 경우에는 OnOK 와 OnCancel 같은 함수를 재정의하고 그 안에서 CDialog 클래스의
OnOK 함수나 OnCancel 함수가 호출되지 않도록 해 주어야 한다.
CModelessDlg *pDlg = new CModelessDlg;
pDlg->Create(IDD_MODELESS);
pDlg->ShowWindow(SW_SHOW);
4. 예제
1) 대화상자를 하나 만든다. 이때 버튼은 [OK] 버튼이나 [CANCEL] 버튼을 만들지 않고 IDC_CLOSE 라는 버튼을 만들었다.
위 2. 번 참조
다른 컨트롤들을 넣고 싶다면 이것은 Modal 대화상자와 완전히 동일하므로 필요한 대로 Design 하면 된다.
그 다음 대화상자용 클래스를 만든다.
2) 대화상자를 생성하고 싶은 곳에 아래 코드를 추가한다. 프로그램 전체에 걸쳐 사용하고 싶은 경우는 멤버로
CModelessDlg *m_pDlg; 를 선언해 놓으면 된다.
CModelessDlg *pDlg = new CModelessDlg;
pDlg->Create(IDD_MODELESS);
pDlg->ShowWindow(SW_SHOW);
3) 대화상자 클래스의 Close 버튼의 이벤트 핸들러를 만들어서 다음 코드를 추가한다. 이 코드는 대화상자를 닫게 만든다.
void CModelessDlg::OnBnClickedClose()
{
// TODO: Add your control notification handler code here
DestroyWindow();
}
4) 대화상자를 만들면서 동적 메모리를 할당한 것이 있다면 이것도 해제시켜 주어야 하는데 이것은 PostNcDestroy()에서
해주면 된다. PostNcDestroy()는 대화상자가 완전히 소멸된 후에 호출되기 때문에 안전하게 삭제할 수 있다.
{
// TODO: Add your specialized code here and/or call the base class
delete this;
//CDialog::PostNcDestroy();
}
////////////////////////////////////////////////////////////////////////////////
메인 다이얼로그에서 새끼 다이얼로그 띄우는법
CDlgScenarioSave dlgScenarioSave;
int iStatus = dlgScenarioSave.DoModal();
if (iStatus == IDCANCEL) // IDOK
{
return;
}
else
{
BCGPMessageBox(m_hWnd,_T("시나리오 저장을 완료했습니다."),m_strDlgName,MB_OK);
}
delete dlgScenarioSave;
// 반환값 때문에 고민했던 부분
// 한번에 고민해결~
EndDialog(IDOK);
EndDialog(IDCANCEL);
/////////////////////////////////////////////////////////////////////////////////////////
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
[Dialog] Dialog의 IDOK, IDCANCEL의 BN_CLICKED메시지 (0) | 2011.02.11 |
---|---|
[Dialog] 대화상자 실행방법 (0) | 2011.02.11 |
[Etc] MFC 프로그램 중복방지 (0) | 2011.02.11 |
[Dialog] 모달리스 다이얼로그의 메모리 해제 (0) | 2011.01.26 |
[Event] 여러개의 파일을 선택 (0) | 2011.01.12 |
댓글