삽질의 현장/- MFC

#009_MFC_MDI (Multi Document Interface)_다중 문서 인터페이스

shovelman 2015. 10. 20. 15:52


안녕하세요 삽잡이입니다.


이번 시간에는 MDI...

즉, 다중 문서 인터페이스에 대해서 알아보려고합니다.


다중 문서를 사용하게 된다면 View 객체를 다중으로 그리고 독립적으로 생성할 수 있습니다.


MDI와 SDI의 핵심적인 차이점은

Main Frame의 Client 영역에만 윈도우들이 만들어지는데

이 윈도우들이 또 다른 Frame, View, Document와 리스소를 가지고 있는 

Document Template를 가지고 있다 이겁니다.


결론적으로, Main Frame이 이제 View의 부모가 아닙니다.

Main Frame 따로... 그리고 Child Frame이라고 부를 각 윈도우들이 존재한다는 것입니다.

따라서 MDI에서는 CMainFrame이라는 부모의 역할과

CChildFrame이라는 자식 윈도우의 역할이 나누어져 있습니다.

자... 이제 상속하는 형태도 다르고 클래스도 하나가 더 추가된 셈입니다...


다시 한번 말씀드리지만, 

Child와 Main Frame은 각각 독립적으로 자식, 부모 역할을 수행합니다.


SDI와 다르게 MDI에서는 APP의 InitInstance()의 코드도 변해있습니다.


기존의 SDI에서는 Single Document Template으로써 

리소스, Document, Frame, View의 ID를 입력 받았습니다.

Frame이 Main Frame이자 View의 부모였지요...


그런데 MDI에서는 Child Frame이 Document, View를 감싸고 있는 Frame입니다.



따라서 Main Frame이 독립적으로 따로 만들어집니다...


 

그리고 APP 객체의 Main 윈도우로 선택을 하는 것입니다.

LoadFraem() 메서드를 통해서 처음 실행됬을 때 리소스를 지정해줬습니다.


MFC는 리소스를 통합으로 관리합니다.

따라서 ID가 아이콘이자 메뉴 등등의 ID라는 것입니다.

즉, 통틀어서 통합하는 형태로 사용합니다.


SDI일 때에는 자동으로 선택이 됬었는데,

MDI에서는 객체를 직접 사용자가 만들고 직접 Main 윈도우를 선택해야합니다.



프로그램을 시작하면 기본적으로 윈도우들이 떠있습니다.

우리가 띄우지 않았는데도 말입니다...

이는 Command 라인을 처리하고 최초의 윈도우 객체들을 생성해주는 위의 코드 때문입니다.



그리고 윈도우를 생성하고 보여줍니다.


창을 띄우지 않은 상태라면 View와 Document가 없는 상태입니다.

즉, 창이 없는 상황과 있는 상황은 다른 상황이라는 것입니다.


 

각 다른 상황이니 위의 메뉴도 다르게 표시되는 경우를 나타내봤습니다.


그런데 만약, 새 창이 있던 없던 동일하게 메뉴에 표시해줘야하는 경우에는 어떻게 해야할까요?

메뉴를 공용으로 나태내고자 할 때 어떻게 해야하냐 이 말입니다...


예를 들어서 도움말 같은 경우에는 

View, Document 같은 객체들이 존재하지 않더라도 제공해줘야하는 기능입니다.

만약 View에 다이어로그에 대한 핸들러를 만든다면,

여러개의 View를 소유하고 있다면 어떤 View에 메시지 핸들러 함수를 호출해야할지 문제개 생깁니다.


따라서, 적어도!

여전이 클라이언트 View와 Document가 존재하지 않더라도 

살아있는 Frame 객체에 핸들러 함수를 만들어내는 것이 합당하겠지요...

 

또한 View가 달라지더라도 동일한 메뉴를 띄우고자 한다면,

모든 경우에 리소스를 복사해주면 됩니다.

중요한 것은 메시지 핸들러 함수를 Frame 객체에 만드는 것이지요...

참고로 리소스에 대한 핸들러 함수가 없다면 

프로그램이 실행되더라도 비활성화 되어있으니 주의하시길 바랍니다.


결론은 다이어로그와 같은 리소스 핸들러를 Frame 객체에 만들자 이겁니다...

선택사항이 아니라 View 객체에 만들어내면 

View 객체가 활성화되지 않는 한 호출될 수가 없습니다... 




APP 객체는 여러개의 Document Template을 소유할 수 있습니다.

또한 각 Document Template들은 여러개의 Document와 View를 가지고 있지요...

물론 MFC의 List로 말입니다...


따라서 이를 통해 Document Template, Document, View 등

어디서든 접근하여 얻어올 수 있습니다.

또한 포인터 (참조)를 얻어와 얼마든지 사용할 수 있고 말입니다...


이번 시간은 여기까지 하겠습니다.

이상 삽잡이였습니다!