제 1 장 MODAL & MODALESS 란?
일반적으로 프로그램을 사용할 때 어떤 메뉴버튼을 눌러 새로운 창을 뜨게 하는 기능이 있는데 어떤 프로그램의 경우 새로운 창을 띄우면 이전에 창을 컨트롤 못하게 프로그래밍 되어있는 프로그램도 있고, 또 다른 경우는 새로운 창을 띄운 상태에서도 이전에 창을 컨트롤 할 수 있게 프로그래밍 되어있는 프로그램도 있다. 모달(MODAL) 과 모달리스(MODALESS)는 위에서 말한 두 가지 방법에 대한 프로그램의 차이다.
프로그램을 만들 때 윈도우의 Form(형식)이나 Dialog(대화상자)를 모달과 모달리스 방식으로 프로그래밍 할 수 있다.
제 2 장 모달(Modal)
제 1 절 모달(Modal) 특징
간단히 말해 새 모달 창이 열렸을 땐 기존에 있던 창을 사용하지 못하는 방식이다. 예를 들어 어떠한 응용프로그램에서 에러 메시지가 뜬다고 가정하자. 그 메시지를 확인 또는 취소를 눌러야만 다음으로 진행이 가능하고, 그 메시지가 뜬 상태라면 뒤에 있는 창을 선택할 수 없다. 즉 새로 열린 창이 프로그램의 제어권을 독점해서 이 창이 종료되기 전엔 다른 작업을 수행할 수 없는 것으로 다른 작업을 할 수 없다는 말은 현재 발생한 모달 다이얼로그의 부모 창을 의미 하며 다른 윈도우 창은 별개로 작업이 가능하다.
이러한 특징 때문에 중요한 메시지를 표시하는 다이얼로그는 거의 모달로 나타낸다. Visual Studio의 정보 대화 상자나, API MessageBox는 사용할 수 있는 모달(Modal) 형식의 한 예이다.
제 2 절 모달(Modal) 간단한 예제
Modal의 경우 생성은 DoMoal() 함수를 사용하고 종료 시 EndDiaLog() 함수를 호출한다.
1. 메인 다이얼로그 창에 버튼을 한 개 만들고 버튼의 caption명을 MODAL이라고 그림<1-1>과 같이 만든다.
2. 새로운 다이얼로그 클래스(DlgNew)를 만들고 1번에서 만들었던 버튼을 클릭했을 시 새로운 창이 모달 형식으로 만들어 지도록 헤더 파일에 새로 만든 클래스를 추가하고 그림<1-2>와 같이 작성을 한다.
3. 새로운 다이얼로그에도 닫기 버튼을 추가하고 닫기 버튼 이벤트에 닫기 버튼을 눌렀을 시 모달 형식으로 만들어진 창이 종료되도록 EndDialog() 함수를 호출한다.
이와 같이 프로그램을 작성하고 프로그램을 시작하면 MODAL 버튼을 눌러서 창을 생성했을 때 부모 창이 컨트롤이 안 되는 것을 알 수 있다.
제 3 장 모달리스(Modaless)
제 1 절 모달리스(Modaless) 특징
.
모달리스(Modaless)는 어느 하나의 다이얼로그 창이 있어도 프로그램 제어권을 독점하지 않으므로 다른 작업을 할 수 있다. 모달리스는 사용자가 순서에 관계없이 액세스할 수 있기 때문에 사용자의 동작에 관계없이 응용 프로그램의 상태를 일관성 있게 유지해야 한다.
도구 창은 종종 모달리스 형식으로 표시되며, Visual Studio 편집 메뉴에서 사용할 수 있는 찾기 대화 상자는 모달리스 대화상자의 한 예다. 모달리스 형식은 자주 사용하는 명령이나 정보를 표시하는 데 사용한다.
제 2 절 모달리스(Modaless) 간단한 예제
Modaless의 경우 생성은 Create 로 하고 종료 시 DestroyWindw() 함수를 호출한다. 앞의 모달 예제해서 만든 클래스들을 그대로 사용하고 생성과 종료 방법을 모달리스 형식으로 만들도록 하겠다.
그림<2-1>
그림 <2-1>에서는 모달리스창를 만들기 위해 모달 예제에서 만든 다이얼로그클래스 형의 포인터를 선언을 했다.
2. 그림<2-2>에서는 그림<2-1>에서 선언했던 포인터를 사용해서 버튼을 눌렀을 때 새로운 창을 생성하게 만드는 코드 이다. 여기서 조건문의 경우에는 모달리스의 경우 새로운 창을 띄웠을 때 부모창이 컨트롤 될 수 있으므로 여러개의 창을 띄우는 것을 방지하기 위해서 사용한 것이다.
modaless를 사용해서 새로운 객체를 생성하고 Create를 통해 창을 만들어준다. Create()함수에 인수로 들어가는 것은 새로운 다이얼로그의 ID 이다.
ShowWindow(SW_SHOW)의 경우 만든 창을 보여주는 코드이다. 만약 창을 만들고도 보여주지 않으려면 SW_HIDE를 사용하면 된다.
3. 그림<2-3>은 새로운 창이 만들어 지고 그 창의 닫기 버튼을 눌렀을 때 발생하는 이벤트 이다. 모달리스는 DoModal 함수로 생성된 것이 아니기 때문에 EndDialog를 사용할 수 없다. 그래서 그림<2-3>과 같이 DestroyWindow();를 사용해준다.
((CmodalDlg *)GetParent()); 의 경우 이 프로그램에서 부모 클래스의 포인터를 반환해 준다. 그 포인터를 사용해서 modaless 포인터를 0으로 만들어 주는게 SetPoint 함수이다. 모달리스 창을 생성할 때 modaless의 값이 없으면 새로운 창을 생성하게 만들었으므로, 여기서 메모리를 해제하더라도 modaless의 포인터 값을 0으로 만들어 줘야 모달리스 창을 닫고 다시 눌렀을 때 새로운 창이 만들어 진다. 그렇지 않으면 modaless 포인터가 해제된 매모리를 가르키고 있어서 새로운 창이 다음에 버튼을 눌렀을 때 만들어지지 않을 것이다.
제 4 장 결론
프로그램을 만들에 목적에 따라 사용자가 컨트롤 할 수 있는 부분을 제한할 필요성이 있다. 위와 같은 방법을 사용해서 목적에 맞게 프로그램을 만들면 보다 나은 프로그램을 만들 수 있을 것이다.