여러 문서 인터페이스 정보
MDI(다중 문서 인터페이스) 애플리케이션의 각 문서는 애플리케이션의 기본 창의 클라이언트 영역 내에 있는 별도의 자식 창에 표시됩니다. 일반적인 MDI 애플리케이션에는 사용자가 여러 텍스트 문서로 작업할 수 있는 워드 프로세싱 애플리케이션과 사용자가 여러 차트 및 스프레드시트로 작업할 수 있는 스프레드시트 애플리케이션이 포함됩니다. 자세한 내용은 다음 항목을 참조하십시오.
프레임, 클라이언트 및 자식 Windows
MDI 애플리케이션에는 프레임 창, MDI 클라이언트 창 및 여러 자식 창의 세 가지 종류가 있습니다. 프레임 창은 애플리케이션의 기본 창과 같습니다. 크기 조정 테두리, 제목 표시줄, 창 메뉴, 최소화 단추 및 최대화 단추가 있습니다. 애플리케이션은 프레임 창에 대한 창 클래스를 등록하고 이를 지원하는 창 프로시저를 제공해야 합니다.
MDI 애플리케이션은 프레임 창의 클라이언트 영역에 출력을 표시하지 않습니다. 대신 MDI 클라이언트 창이 표시됩니다. MDI 클라이언트 창은 미리 등록된 창 클래스 MDICLIENT에 속하는 특수 형식의 자식 창입니다. 클라이언트 창은 프레임 창의 자식입니다. 자식 창의 배경 역할을 합니다. 또한 자식 창을 만들고 조작하기 위한 지원도 제공합니다. 예를 들어 MDI 애플리케이션은 MDI 클라이언트 창에 메시지를 보내 자식 창을 만들거나 활성화하거나 최대화할 수 있습니다.
사용자가 문서를 열거나 만들면 클라이언트 창에서 문서에 대한 자식 창을 만듭니다. 클라이언트 창은 애플리케이션에 있는 모든 MDI 자식 창의 부모 창입니다. 각 자식 창에는 크기 조정 테두리, 제목 표시줄, 창 메뉴, 최소화 단추 및 최대화 단추가 있습니다. 자식 창이 잘리기 때문에 클라이언트 창에 국한되어 외부에 나타날 수 없습니다.
MDI 애플리케이션은 여러 종류의 문서를 지원할 수 있습니다. 예를 들어 일반적인 스프레드시트 애플리케이션을 사용하면 사용자가 차트와 스프레드시트를 모두 사용할 수 있습니다. 지원하는 각 문서 유형에 대해 MDI 애플리케이션은 자식 창 클래스를 등록하고 해당 클래스에 속하는 창을 지원하는 창 프로시저를 제공해야 합니다. 창 클래스에 대한 자세한 내용은 창 클래스를 참조하세요. 창 프로시저에 대한 자세한 내용은 창 프로시저를 참조하세요.
다음은 일반적인 MDI 애플리케이션입니다. Multipad라는 이름이 지정됩니다.
자식 창 만들기
자식 창을 만들기 위해 MDI 애플리케이션은 CreateMDIWindow 함수를 호출하거나 MDI 클라이언트 창에 WM_MDICREATE 메시지를 보냅니다. MDI 자식 창을 만드는 보다 효율적인 방법은 createWindowEx 함수를 호출하고 WS_EX_MDICHILD 확장 스타일을 지정하는 것입니다.
자식 창을 삭제하기 위해 MDI 애플리케이션은 MDI 클라이언트 창에 WM_MDIDESTROY 메시지를 보냅니다.
자식 창 활성화
언제든지 클라이언트 창에 여러 자식 창이 나타날 수 있지만 하나만 활성화할 수 있습니다. 활성 자식 창은 다른 모든 자식 창 앞에 배치되고 해당 테두리가 강조 표시됩니다.
사용자는 비활성 자식 창을 클릭하여 활성화할 수 있습니다. MDI 애플리케이션은 MDI 클라이언트 창에 WM_MDIACTIVATE 메시지를 보내 자식 창을 활성화합니다. 클라이언트 창이 이 메시지를 처리할 때 활성화할 자식 창의 창 프로시저와 비활성화되는 자식 창의 창 프로시저로 WM_MDIACTIVATE 메시지를 보냅니 다.
자식 창이 활성화되지 않도록 하려면 FALSE를 반환하여 자식 창에 대한 WM_NCACTIVATE 메시지를 처리합니다.
시스템은 겹치는 창 스택에서 각 자식 창의 위치를 추적합니다. 이 스택을 Z-Order라고 합니다. 사용자는 현재 창의 창 메뉴에서 다음 을 클릭하여 Z 순서로 다음 자식 창을 활성화할 수 있습니다. 애플리케이션은 클라이언트 창에 WM_MDINEXT 메시지를 전송하여 Z 순서의 다음(또는 이전) 자식 창을 활성화합니다.
활성 자식 창에 대한 핸들을 검색하기 위해 MDI 애플리케이션은 클라이언트 창에 WM_MDIGETACTIVE 메시지를 보냅니다.
여러 문서 메뉴
MDI 애플리케이션의 프레임 창에는 창 메뉴가 있는 메뉴 모음이 포함되어야 합니다. 창 메뉴에는 클라이언트 창 내에서 자식 창을 정렬하거나 모든 자식 창을 닫는 항목이 포함되어야 합니다. 일반적인 MDI 애플리케이션의 창 메뉴에는 다음 표의 항목이 포함될 수 있습니다.
Menu item | 목적 |
---|---|
타일 | 자식 창을 타일 형식으로 정렬하여 각 창이 클라이언트 창에 전체적으로 표시되도록 합니다. |
Cascade | 자식 창을 계단식 형식으로 정렬합니다. 자식 창이 서로 겹치지만 각 창의 제목 표시줄이 표시됩니다. |
아이콘 정렬 | 최소화된 자식 창의 아이콘을 클라이언트 창 아래쪽에 정렬합니다. |
모두 닫기 | 모든 자식 창을 닫습니다. |
자식 창을 만들 때마다 시스템은 창 메뉴에 새 메뉴 항목을 자동으로 추가합니다. 메뉴 항목의 텍스트는 새 자식 창의 메뉴 모음에 있는 텍스트와 동일합니다. 메뉴 항목을 클릭하면 사용자가 해당 자식 창을 활성화할 수 있습니다. 자식 창이 제거되면 시스템은 창 메뉴에서 해당 메뉴 항목을 자동으로 제거합니다.
시스템은 창 메뉴에 최대 10개의 메뉴 항목을 추가할 수 있습니다. 10번째 자식 창을 만들면 시스템에서 창 메뉴에 추가 Windows 항목을 추가합니다. 이 항목을 클릭하면 창 선택 대화 상자가 표시됩니다. 대화 상자에는 현재 사용 가능한 모든 MDI 자식 창의 제목이 있는 목록 상자가 포함되어 있습니다. 사용자는 목록 상자에서 제목을 클릭하여 자식 창을 활성화할 수 있습니다.
MDI 애플리케이션이 여러 유형의 자식 창을 지원하는 경우 현재 창과 연결된 작업을 반영하도록 메뉴 모음을 조정합니다. 이렇게 하려면 애플리케이션에서 지원하는 각 자식 창 유형에 대해 별도의 메뉴 리소스를 제공합니다. 새 유형의 자식 창이 활성화되면 애플리케이션은 클라이언트 창에 WM_MDISETMENU 메시지를 보내고 해당 메뉴에 핸들을 전달해야 합니다.
자식 창이 없으면 메뉴 모음에는 문서를 만들거나 여는 데 사용되는 항목만 포함되어야 합니다.
사용자가 커서 키를 사용하여 MDI 애플리케이션의 메뉴를 탐색할 때 키는 사용자가 일반적인 애플리케이션의 메뉴를 탐색할 때와 다르게 동작합니다. MDI 애플리케이션에서 컨트롤은 애플리케이션의 창 메뉴에서 활성 자식 창의 창 메뉴로 전달된 다음 메뉴 모음의 첫 번째 항목으로 전달됩니다.
여러 문서 가속기
자식 창에 대한 가속기 키를 수신하고 처리하려면 MDI 애플리케이션에 Message 루프에 TranslateMDISysAccel 함수가 포함되어야 합니다. 루프는 TranslateAccelerator 또는 DispatchMessage 함수를 호출하기 전에 TranslateMDISysAccel을 호출해야 합니다.
MDI 자식 창의 창 메뉴에 있는 가속기 키는 MDI가 아닌 자식 창의 바로 가기 키와 다릅니다. MDI 자식 창에서 ALT+ – (빼기) 키 조합이 창 메뉴를 열고 Ctrl+F4 키 조합이 활성 자식 창을 닫고 Ctrl+F6 키 조합이 다음 자식 창을 활성화합니다.
자식 창 크기 및 정렬
MDI 애플리케이션은 MDI 클라이언트 창에 메시지를 전송하여 자식 창의 크기와 위치를 제어합니다. 활성 자식 창을 최대화하기 위해 애플리케이션은 클라이언트 창에 WM_MDIMAXIMIZE 메시지를 보냅니다. 자식 창이 최대화되면 해당 클라이언트 영역이 MDI 클라이언트 창을 완전히 채웁니다. 또한 시스템은 자식 창의 제목 표시줄을 자동으로 숨기고 자식 창의 창 메뉴 아이콘과 복원 단추를 MDI 애플리케이션의 메뉴 모음에 추가합니다. 애플리케이션은 클라이언트 창에 WM_MDIRESTORE 메시지를 전송하여 클라이언트 창을 원래 크기 및 위치로 복원할 수 있습니다.
MDI 애플리케이션은 자식 창을 계단식 또는 타일 형식으로 정렬할 수 있습니다. 자식 창이 계단식으로 배열되면 창이 스택에 표시됩니다. 스택 아래쪽의 창은 화면의 왼쪽 위 모서리를 차지하고 나머지 창은 세로 및 가로로 오프셋되므로 각 자식 창의 왼쪽 테두리와 제목 표시줄이 표시됩니다. 하위 창을 계단식 형식으로 정렬하기 위해 MDI 애플리케이션은 WM_MDICASCADE 메시지를 보냅니다. 일반적으로 애플리케이션은 사용자가 창 메뉴에서 Cascade 를 클릭하면 이 메시지를 보냅니다.
자식 창이 타일로 표시되면 시스템은 각 자식 창을 전체적으로 표시합니다. 이 창은 하나도 겹치지 않습니다. 필요에 따라 모든 창의 크기가 클라이언트 창에 맞게 조정됩니다. 타일 형식으로 자식 창을 정렬하기 위해 MDI 애플리케이션은 클라이언트 창에 WM_MDITILE 메시지를 보냅니다. 일반적으로 애플리케이션은 사용자가 창 메뉴에서 타일 을 클릭할 때 이 메시지를 보냅니다.
MDI 애플리케이션은 지원하는 각 자식 창 유형에 대해 다른 아이콘을 제공해야 합니다. 애플리케이션은 자식 창 클래스를 등록할 때 아이콘을 지정합니다. 자식 창이 최소화되면 시스템은 클라이언트 창의 아래쪽 부분에 자식 창의 아이콘을 자동으로 표시합니다. MDI 애플리케이션은 클라이언트 창에 WM_MDIICONARRANGE 메시지를 전송하여 시스템에서 자식 창 아이콘을 정렬하도록 지시합니다. 일반적으로 애플리케이션은 사용자가 창 메뉴에서 아이콘 정렬 을 클릭하면 이 메시지를 보냅니다.
아이콘 제목 창
MDI 자식 창을 최소화할 수 있으므로 MDI 애플리케이션은 일반 MDI 자식 창인 것처럼 아이콘 제목 창을 조작하지 않아야 합니다. 애플리케이션이 MDI 클라이언트 창의 자식 창을 열거하면 아이콘 제목 창이 나타납니다. 그러나 아이콘 제목 창은 MDI 자식 창이 소유하고 있다는 점에서 다른 자식 창과 다릅니다.
자식 창이 아이콘 제목 창인지 확인하려면 getWindow 함수를 GW_OWNER 인덱스와 함께 사용합니다. 타이틀이 아닌 창은 NULL을 반환합니다. 메뉴 및 대화 상자가 소유 창이므로 최상위 창에는 이 테스트가 충분하지 않습니다.
자식 창 데이터
자식 창의 수는 사용자가 여는 문서 수에 따라 다르기 때문에 MDI 애플리케이션은 데이터(예: 현재 파일의 이름)를 각 자식 창과 연결할 수 있어야 합니다. 여기에는 두 가지 방법이 있습니다.
- 자식 창 데이터를 창 구조에 저장합니다.
- 창 속성을 사용합니다.
창 구조체
MDI 애플리케이션이 창 클래스를 등록하면 이 특정 창 클래스와 관련된 애플리케이션 데이터에 대한 창 구조의 추가 공간을 예약할 수 있습니다. 이 추가 공간에서 데이터를 저장하고 검색하기 위해 애플리케이션은 GetWindowLong 및 SetWindowLong 함수를 사용합니다.
자식 창에 대한 많은 양의 데이터를 유지 관리하기 위해 애플리케이션은 데이터 구조에 대한 메모리를 할당한 다음 자식 창과 연결된 추가 공간에 구조체가 포함된 메모리에 핸들을 저장할 수 있습니다.
창 속성
MDI 애플리케이션은 창 속성을 사용하여 문서별 데이터를 저장할 수도 있습니다. 문서별 데이터는 특정 자식 창에 포함된 문서 유형과 관련된 데이터입니다. 속성은 창 클래스를 등록할 때 추가 공간을 할당할 필요가 없다는 측면에서 창 구조의 추가 공간과 다릅니다. 창에는 여러 속성이 있을 수 있습니다. 또한 오프셋을 사용하여 창 구조의 추가 공간에 액세스하는 경우 속성을 문자열 이름으로 참조합니다. 창 속성에 대한 자세한 내용은 창 속성을 참조하세요.