다음을 통해 공유


다중 문서 인터페이스 정보

MDI(다중 문서 인터페이스) 애플리케이션의 각 문서는 애플리케이션 주 창의 클라이언트 영역 내에 있는 별도의 자식 창에 표시됩니다. 일반적인 MDI 애플리케이션에는 사용자가 여러 텍스트 문서로 작업할 수 있는 워드 프로세싱 애플리케이션과 사용자가 여러 차트 및 스프레드시트로 작업할 수 있는 스프레드시트 애플리케이션이 포함됩니다. 자세한 내용은 다음 항목을 참조하세요.

프레임, 클라이언트 및 자식 창

MDI 애플리케이션에는 프레임 창, MDI 클라이언트 창 및 여러 자식 창의 세 가지 종류가 있습니다. 프레임 창 애플리케이션의 주 창과 비슷합니다. 크기 조정 테두리, 제목 표시줄, 창 메뉴, 최소화 단추 및 최대화 단추가 있습니다. 애플리케이션은 프레임 창에 대한 창 클래스를 등록하고 이를 지원하는 창 프로시저를 제공해야 합니다.

MDI 애플리케이션은 프레임 창의 클라이언트 영역에 출력을 표시하지 않습니다. 대신 MDI 클라이언트 창이 표시됩니다. MDI 클라이언트 창은 미리 등록된 창 클래스 MDICLIENT에 속하는 특수한 유형의 자식 창입니다. 클라이언트 창은 프레임 창의 자식입니다. 자식 창의 배경 역할을 합니다. 또한 자식 창을 만들고 조작하기 위한 지원도 제공합니다. 예를 들어 MDI 애플리케이션은 MDI 클라이언트 창에 메시지를 전송하여 자식 창을 만들거나 활성화하거나 최대화할 수 있습니다.

사용자가 문서를 열거나 만들면 클라이언트 창에서 문서에 대한 자식 창을 만듭니다. 클라이언트 창은 애플리케이션에 있는 모든 MDI 자식 창의 부모 창입니다. 각 자식 창에는 크기 조정 테두리, 제목 표시줄, 창 메뉴, 최소화 단추 및 최대화 단추가 있습니다. 자식 창은 잘리기 때문에 클라이언트 창으로 제한되며 외부에 나타날 수 없습니다.

MDI 애플리케이션은 여러 종류의 문서를 지원할 수 있습니다. 예를 들어 일반적인 스프레드시트 애플리케이션을 사용하면 사용자가 차트와 스프레드시트를 모두 사용할 수 있습니다. 지원하는 각 문서 유형에 대해 MDI 애플리케이션은 자식 창 클래스를 등록하고 해당 클래스에 속하는 창을 지원하는 창 프로시저를 제공해야 합니다. 창 클래스에 대한 자세한 내용은 창 클래스참조하세요. 창 프로시저에 대한 자세한 내용은 창 프로시저참조하세요.

다음은 일반적인 MDI 애플리케이션입니다. 이 이름은 멀티패드입니다.

다중 패드 mdi 애플리케이션 프레임 창 및 클라이언트 창

자식 창 만들기

자식 창을 만들기 위해 MDI 애플리케이션은 CreateMDIWindow 함수를 호출하거나 MDI 클라이언트 창에 WM_MDICREATE 메시지를 보냅니다. MDI 자식 창을 만드는 보다 효율적인 방법은 WS_EX_MDICHILD 확장 스타일을 지정하는 CreateWindowEx 함수를 호출하는 것입니다.

자식 창을 삭제하기 위해 MDI 애플리케이션은 MDI 클라이언트 창에 WM_MDIDESTROY 메시지를 보냅니다.

자식 창 활성화

한 번에 클라이언트 창에 여러 자식 창이 나타날 수 있지만 하나만 활성화할 수 있습니다. 활성 자식 창은 다른 모든 자식 창 앞에 배치되고 테두리가 강조 표시됩니다.

사용자는 비활성 자식 창을 클릭하여 활성화할 수 있습니다. MDI 애플리케이션은 MDI 클라이언트 창에 WM_MDIACTIVATE 메시지를 전송하여 자식 창을 활성화합니다. 클라이언트 창에서 이 메시지를 처리할 때 활성화할 자식 창의 창 프로시저 및 비활성화되는 자식 창의 창 프로시저에 WM_MDIACTIVATE 메시지를 보냅니다.

자식 창이 활성화되지 않도록 하려면 자식 창에 대한 WM_NCACTIVATE 메시지를 처리하여 FALSE를 반환합니다.

시스템은 겹치는 창 스택에서 각 자식 창의 위치를 추적합니다. 이 스태킹은 Z-Order로 알려져 있습니다. 사용자는 현재 창의 창 메뉴에서 다음 클릭하여 Z 순서로 다음 자식 창을 활성화할 수 있습니다. 애플리케이션은 클라이언트 창에 WM_MDINEXT 메시지를 전송하여 Z 순서로 다음(또는 이전) 자식 창을 활성화합니다.

활성 자식 창에 대한 핸들을 검색하기 위해 MDI 애플리케이션은 클라이언트 창에 WM_MDIGETACTIVE 메시지를 보냅니다.

여러 문서 메뉴

MDI 애플리케이션의 프레임 창에는 창 메뉴가 있는 메뉴 모음이 포함되어야 합니다. 창 메뉴에는 클라이언트 창 내에서 자식 창을 정렬하거나 모든 자식 창을 닫는 항목이 포함되어야 합니다. 일반적인 MDI 애플리케이션의 창 메뉴에는 다음 표의 항목이 포함될 수 있습니다.

메뉴 항목 목적
타일 자식 창을 타일 형식으로 정렬하여 각 창이 클라이언트 창에 전체적으로 표시되도록 합니다.
캐스케이드 자식 창을 계단식 형식으로 정렬합니다. 자식 창이 서로 겹치지만 각 창의 제목 표시줄이 표시됩니다.
아이콘 정렬 클라이언트 창의 아래쪽을 따라 최소화된 자식 창의 아이콘을 정렬합니다.
모두 닫기 모든 자식 창을 닫습니다.

 

자식 창을 만들 때마다 시스템은 창 메뉴에 새 메뉴 항목을 자동으로 추가합니다. 메뉴 항목의 텍스트는 새 자식 창의 메뉴 모음에 있는 텍스트와 동일합니다. 메뉴 항목을 클릭하면 사용자가 해당 자식 창을 활성화할 수 있습니다. 자식 창이 제거되면 시스템은 창 메뉴에서 해당 메뉴 항목을 자동으로 제거합니다.

시스템은 창 메뉴에 최대 10개의 메뉴 항목을 추가할 수 있습니다. 10번째 자식 창이 생성되면, 시스템은 '더 많은 창 ' 항목을 창 메뉴에 추가합니다. 이 항목을 클릭하면 선택 대화 상자가 표시됩니다. 대화 상자에는 현재 사용할 수 있는 모든 MDI 자식 창의 제목이 있는 목록 상자가 포함되어 있습니다. 사용자는 목록 상자에서 제목을 클릭하여 자식 창을 활성화할 수 있습니다.

MDI 애플리케이션이 여러 유형의 자식 창을 지원하는 경우 현재 창과 연결된 작업을 반영하도록 메뉴 모음을 조정합니다. 이렇게 하려면 애플리케이션에서 지원하는 각 자식 창 유형에 대해 별도의 메뉴 리소스를 제공합니다. 새 유형의 자식 창이 활성화되면 애플리케이션은 클라이언트 창에 WM_MDISETMENU 메시지를 보내고 해당 메뉴에 핸들을 전달해야 합니다.

자식 창이 없으면 메뉴 모음에 문서를 만들거나 여는 데 사용되는 항목만 포함되어야 합니다.

사용자가 커서 키를 사용하여 MDI 애플리케이션의 메뉴를 탐색하는 경우 키는 사용자가 일반적인 애플리케이션의 메뉴를 탐색할 때와 다르게 동작합니다. MDI 애플리케이션에서 컨트롤은 애플리케이션의 창 메뉴에서 활성 자식 창의 창 메뉴로 전달한 다음 메뉴 모음의 첫 번째 항목으로 전달됩니다.

여러 문서 가속기

자식 창에 대한 가속기 키를 수신하고 처리하려면 MDI 애플리케이션이 메시지 루프에 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 자식 창이 소유하고 있다는 점에서 다른 자식 창과 다릅니다.

자식 창이 아이콘 제목 창인지 확인하려면 GW_OWNER 인덱스와 함께 GetWindow 함수를 사용합니다. 타이틀이 아닌 창은 NULL 반환합니다. 메뉴와 대화 상자가 소유 창이므로 이 테스트는 최상위 창에 충분하지 않습니다.

자식 창 데이터

자식 창의 수는 사용자가 여는 문서 수에 따라 다르므로 MDI 애플리케이션은 데이터(예: 현재 파일의 이름)를 각 자식 창과 연결할 수 있어야 합니다. 이 작업을 수행하는 방법에는 두 가지가 있습니다.

  • 자식 창 데이터를 창 구조체에 저장합니다.
  • 창 속성을 사용합니다.

창 구조체

MDI 애플리케이션이 창 클래스를 등록하는 경우 이 특정 창 클래스와 관련된 애플리케이션 데이터에 대해 창 구조에 추가 공간을 예약할 수 있습니다. 이 추가 공간에서 데이터를 저장하고 검색하기 위해 애플리케이션은 GetWindowLong 및 setWindowLong함수를사용합니다.

자식 창에 대 한 많은 양의 데이터를 유지 관리 하기 위해 애플리케이션 데이터 구조에 대 한 메모리를 할당 하 고 자식 창과 연결 된 여분의 공간에 구조를 포함 하는 메모리에 핸들을 저장할 수 있습니다.

창 속성

MDI 애플리케이션은 창 속성을 사용하여 문서별 데이터를 저장할 수도 있습니다. 문서별 데이터 특정 자식 창에 포함된 문서 유형과 관련된 데이터입니다. 속성은 창 클래스를 등록할 때 추가 공간을 할당할 필요가 없다는 측면에서 창 구조의 추가 공간과 다릅니다. 창에는 여러 속성이 있을 수 있습니다. 또한 오프셋이 창 구조의 추가 공간에 액세스하는 데 사용되는 경우 속성은 문자열 이름으로 참조됩니다. 창 속성에 대한 자세한 내용은 창 속성참조하세요.