본문 바로가기
C & C++/MFC 컨트롤

[Dialog] 대화상자 실행방법

by izen8 2011. 2. 11.
반응형

1. 대화상자의 두 가지 실행 방식

 ① Modal 방식

 

첫 번째, Modal 방식의 Dialog(대화상자)는 방금까지 작업했던 창을 아무리 찍으려고 애를 써도 방금 막 화면에 나타난 Dialog만을

 

컨트롤 할 수 있는 상태가 되는 것이다. 이때 새로 생긴 Dialog가 닫히기 전까지는 죽었다 깨도 밑에 Dialog를 못 쓰는 것이다.

 

예를 들자면 "한글" 같은 문서 작성 프로그램에서 문서 작업 하다가 글꼴 바꾸려고 폰트 대화상자를 열었을 때, 폰트 설정 대화상자를 닫을 때까지는 죽었다 깨어나도 아래에 있는 본문의 글씨를 수정할 수 없는 것이다.

물론.. 나중에 나올 버전은 바뀔 수도 있겠지만 최소한 한글 2007은 그렇게 되도록 짜여져 있다.

 

 ② Modeless 방식

두 번째, Modeless 방식의 Dialog는 이전에 작업했던 창들을 찍어서 바로 쓸 수가 있다. 여러 개의 Dialog를 한 번에 왔다 갔다 하면서 쓸 수 있는 방식이다.

Modal 방식이 뭔지 이해가 간다면 예제는 스스로도 확인할 수 있지 않을까 싶다.

 

위 방식들은 사용의 용도와 편의를 고려해서 사용하면 된다.

 

하지만 왜(?) 두 가지 방식의 구현 방법이 다른걸까?

 

여기서 이 점에 대해서 반드시 고려해 봐야 하고, 그래야지만 제대로 이해하고 쓸 수 있지 않을까?

그럼 구현상의 차이점이 무엇인지 알아보자!

 

2. 구현 차이점

Modal 방식

 

쉽다. 물론 말은 이렇게 하면서도 불과 3시간 전까지는 이걸 어찌 한단 말인가 하고 멍 때린 인간이 바로 이 사람이지만... _ㅡㅋ

 

다음과 같은 방법으로 만들면 된다. 만약 설명 부분이 잘 이해가 안 된다면... 참고 서적을 이용해 보면 좋겠다.

 

Modal 방식은 Modal 방식으로 화면에 표시하기 위해 만들어진 대화상자(Dialog-->줄여서 Dlg)를 불러 쓰는 방식이다.

 

예를 들어서 ModalDlg.cpp로 작성되어진 새로운 대화상자가 하나가 있을 경우에

 

이 대화상자를 Modal 방식으로 화면에 보여주기 위해서는 우선 CModalDlg 클래스를 이용하여 대화상자를 위한 객체를 하나 선언한다.

CModalDlg tmpModalTest;

 

그리고 객체를 통해서 화면에 Modal 형태의 모습을 보여주는 명령을 준다.

tmpModalTest.DoModal();

 

이때 DoModal() 함수로 반환되어지는 리턴 값은 대화상자에서 누른 확인-OK(IDOK) 버튼이거나 취소-CANCEL(IDCANCEL) 값일 수 있다.

 

만약 어떤 버튼이 눌러지느냐에 따라서 처리해야 할 작업이 틀리다면 다음과 같이 처리하면 된다.

if ( tmpModalTest.DoModal() == IDOK)

 

이렇게 하면 IDOK로 반환되는 값에 대하여 처리하거나 그렇지 못한 경우에 대하여도 처리가 가능하다.

물론 Modal의 특성상 대화상자가 닫히기 전까지는 저 위의 함수에서 수행이 끝날 떄 까지는 대기 상태가 되겠다.

 

 ① Modeless 방식

 

Modeless 방식의 대화상자라고 해서 크게 다르지는 않습니다.

똑같이 생성을 해주는 과정이 필요합니다.

하지만 그 방법이 약간 다릅니다.

Modal 방식에서 DoModal로 생성하였다면, 모달리스는 Create 함수로 생성합니다.

이때 아주 중요한 차이점이 있습니다.

Modal 방식에서는 객체를 지역 변수로 선언하여서 사용했었는데,

Modeless 방식에서는 동적으로 할당 받아서 사용합니다.

 

이때 Modeless 대화상자는 프로그램의 시작부터 끝까지 계속 화면이 출력되어 있을 수 있기 때문에 포인터 변수만 우선 멤버 변수로서 선언하여 가지고 있다가 필요할 때에만 new 연산자를 이용해서 동적으로 객체를 생성합니다.

 

예를 들면 이렇게 되겠죠.

 

우선 다음과 같이 Modeless를 위한 대화상자를 위한 Class ModelessTest.cpp 파일이 있습니다.

그리고 이 Modeless 대화상자를 화면에 표시하기 위해서 MainFrame에 포인터 멤버 변수로 선언하여 놓습니다.

#헤더파일

 

class CModelessTest;                                           

// CModelessTest 클래스를 사용할 것임을 선언

 

class CMainFrame : public CFrameWnd

{

CModelessTest *tmpModelessTest;                    

// 포인터 맴버 객체를 선언

 

}

 

#소스파일

 

#include "ModelessTest.h"                                    

// Modeless 대화상자로 사용할 대화상자 정의부 포함시키기

 

void CMainFrame::OnMoeless()                             

// Modeless 대화상자를 만들게 할 함수의 구현부

  {

tmpModelessTest = new CModelessTest;             

// Modeless 대화상자를 화면에 표시하기 위하여 대화상자를 동적으로 할당

 

tmpModeless->Create(this);                                

// Modeless 대화상자를 현재화면에 생성

 }

 

위와 같은 방법으로 생성할 수 있겠습니다.

여기서 서로의 생성 방식이 지역 변수를 선언해서 쓰는지 동적으로 할당 받아서 쓰는지를 기억해야 합니다.

동일한 대화상자라 하더라도 호출 방식에 따라서 다르게 사용되어질 수 있는 것입니다.

 

이때 Modal로 구현할 것이냐? 아니면 Modeless로 할 것이냐의 문제는 현재 새로 보여줄 대화상자가 원래 작업하던

 

화면에서 서로 상호 작용할 수 있는 것인지, 아니면 독립적으로 하나씩 개별 수행 되어져야 하는지를 따져보고 결정할 사항입니다.

 

반응형

댓글