다음을 통해 공유


TN029: 분할 창

이 참고에서는 창 분할을 제공하고 다른 창의 크기 조정을 관리하는 MFC CSplitterWnd 클래스에 대해 설명합니다.

구분자 스타일

A CSplitterWnd 는 분할 창의 두 가지 스타일을 지원합니다.

"정적 분할자"에서는 분할자 창이 생성될 때 패널을 만듭니다. 창의 순서와 수는 변경되지 않습니다. 분할 막대는 다른 창의 크기를 조정하는 데 사용됩니다. 이 스타일을 사용하여 각 창에 다른 보기 클래스를 표시할 수 있습니다. Visual C++ 그래픽 편집기와 Windows 파일 관리자는 이 분할자 스타일을 사용하는 프로그램의 예입니다. 이 분할자 창 스타일은 분할자 상자를 사용하지 않습니다.

"동적 분할자"에서는 사용자가 새 보기를 분할하고 분할 해제할 때 추가 창이 만들어지고 제거됩니다. 이 분할기는 단일 보기로 시작하며 사용자가 분할을 시작할 수 있는 분할 상자를 제공합니다. 분할자 창은 보기가 한 방향으로 분할되면 새 뷰 개체를 동적으로 만듭니다. 이 새 뷰 개체는 새 창을 나타냅니다. 키보드 인터페이스를 사용하여 보기가 두 방향으로 분할된 경우 분할자 창은 세 개의 새 창에 대해 세 개의 새 보기 개체를 만듭니다. 분할이 활성화되어 있는 동안 창 사이에 분할자 상자가 분할 막대로 표시됩니다. Windows는 사용자가 분할을 제거할 때 추가 뷰 개체를 삭제하지만 원래 보기는 분할자 창 자체가 제거될 때까지 유지됩니다. Microsoft Excel 및 Microsoft Word는 동적 분할자 스타일을 사용하는 애플리케이션의 예입니다.

두 종류의 분할자 창을 만들 때 분할자에서 관리할 최대 행 수와 열 수를 지정해야 합니다. 정적 분할자는 모든 행과 열을 채우는 패널을 만듭니다. 동적 분할자가 생성될 때 CSplitterWnd 첫 번째 창만 만듭니다.

정적 분할기에서 지정할 수 있는 최대 창 수는 16개 행 16개 열입니다. 권장되는 구성은 다음과 같습니다.

  • 1행 x 2열: 일반적으로 서로 다른 패널

  • 2행 x 1열: 일반적으로 서로 다른 패널

  • 행 2개 x 열 2개: 보통 유사한 패널로 구성됨

동적 분할자에서 지정할 수 있는 최대 창 수는 2열씩 2행입니다. 권장되는 구성은 다음과 같습니다.

  • 행 1개 x 열 2개 : 열 형식 데이터

  • 2행 x 1열: 텍스트 또는 기타 데이터

  • 2행 x 2열: 그리드 또는 테이블 지향 데이터

분할자 예제

대부분의 MFC 샘플 프로그램은 분할 창을 직간접적으로 사용합니다. MFC 일반 샘플 VIEWEX 는 분할자에서 분할자를 배치하는 방법을 포함하여 정적 분할기의 여러 사용을 보여 줍니다.

ClassWizard를 사용하여 분할자 창이 포함된 새 MDI(다중 문서 인터페이스) 자식 프레임 창 클래스를 만들 수도 있습니다. 분할자 창에 대한 자세한 내용은 여러 문서 유형, 보기 및 프레임 창을 참조하세요.

구현에서 사용하는 용어

다음은 분할자 창과 관련된 용어 목록입니다.

CSplitterWnd: 행 또는 열의 모든 창 간에 공유되는 창 분할 컨트롤과 스크롤 막대를 제공하는 창입니다. 0부터 시작하는 숫자로 행과 열을 지정합니다(첫 번째 창은 행 = 0, 열 = 0).

팬: CSplitterWnd이(가) 관리하는 애플리케이션 전용 창입니다. 창은 일반적으로 CView 클래스에서 파생되는 개체이지만 적절한 자식 창 ID를 가진 모든 CWnd 개체일 수 있습니다.

CWnd에서 파생된 개체를 사용하려면, CreateView에서 파생된 클래스를 사용할 때처럼, 해당 개체의 RUNTIME_CLASS를 CView 함수에 전달하십시오. 프레임워크는 런타임에 동적 생성을 사용하므로 클래스는 DECLARE_DYNCREATE 및 IMPLEMENT_DYNCREATE 사용해야 합니다. 클래스와 CSplitterWnd 관련된 CView 코드가 많지만 CObject::IsKindOf 는 해당 작업을 수행하기 전에 항상 사용됩니다.

분할 막대: 창의 행과 열 사이에 배치되는 컨트롤입니다. 창의 행 또는 열 크기를 조정하는 데 사용할 수 있습니다.

Splitter Box: 창의 새 행 또는 열을 만드는 데 사용할 수 있는 동적 CSplitterWnd 컨트롤입니다. 세로 스크롤 막대의 위쪽 또는 가로 스크롤 막대의 왼쪽에 있습니다.

분할자 교차: 세로 분할 막대와 가로 분할 막대의 교집합입니다. 행 및 창 열의 크기를 동시에 조정하도록 끌어다 놓을 수 있습니다.

공유 스크롤 막대

클래스는 CSplitterWnd 공유 스크롤 막대도 지원합니다. 이 스크롤 막대 컨트롤은 CSplitterWnd의 하위 요소이며 분할기의 다른 창들과 공유됩니다.

예를 들어 1행 x 2열 창을 만들 때 CSplitterWnd를 생성할 때 WS_VSCROLL을 지정할 수 있습니다. Windows는 두 창 간에 공유되는 특수 스크롤 막대 컨트롤을 만듭니다.

[      ][      ][^]
[pane00][pane01][|]
[      ][      ][v]

사용자가 스크롤 막대를 이동하면 WM_VSCROLL 메시지가 두 보기로 전송됩니다. 두 보기 중 하나가 스크롤 막대 위치를 설정하면 공유 스크롤 막대가 설정됩니다.

공유 스크롤 막대는 유사한 뷰 개체에서 가장 유용합니다. 분할자에서 다양한 형식의 보기를 혼합하는 경우 스크롤 위치를 조정하는 특수 코드를 작성해야 할 수 있습니다. CView에서 파생된 모든 클래스가 CWnd 스크롤 막대 API를 사용할 경우, 존재하는 경우 공유 스크롤 막대에 위임됩니다. CScrollView 구현은 공유 스크롤 막대를 지원하는 CView 클래스의 하나의 예입니다. 파생 CView되지 않은 클래스, 제어되지 않는 스크롤 막대를 사용하는 클래스 또는 표준 Windows 구현(예 CEditView: )을 사용하는 클래스는 공유 스크롤 막대 기능 CSplitterWnd에서 작동하지 않습니다.

최소 크기

각 행에 대해 최소 행 높이가 있으며 각 열에 대해 최소 열 너비가 있습니다. 이 최소값은 창이 너무 작아서 전체 세부 정보를 표시할 수 없도록 보장합니다.

정적 분할자 창의 경우 초기 최소 행 높이와 열 너비는 0입니다. 동적 분할자 창의 경우 초기 최소 행 높이와 열 너비는 함수의 CSplitterWnd::Create 매개 변수에 의해 설정됩니다.

CSplitterWnd::SetRowInfoCSplitterWnd::SetColumnInfo 함수를 사용하여 이러한 최소 크기를 변경할 수 있습니다.

실제 크기 및 이상적인 크기

분할자 창의 창 레이아웃은 해당 창이 포함된 프레임의 크기에 따라 달라집니다. 사용자가 포함된 프레임의 크기를 조정하면 CSplitterWnd이 창들을 가능한 한 잘 맞도록 재배치하고 크기를 조정합니다.

사용자는 행 높이와 열 너비 크기를 수동으로 설정하거나 프로그램에서 클래스를 사용하여 CSplitterWnd 이상적인 크기를 설정할 수 있습니다. 실제 크기는 이상보다 작거나 클 수 있습니다. 이상적인 크기를 표시할 공간이 부족하거나 분할자 창의 오른쪽이나 아래쪽에 빈 공간이 너무 많은 경우 Windows에서 실제 크기를 조정합니다.

사용자 지정 컨트롤

사용자 지정된 동작 및 사용자 지정된 인터페이스를 제공하도록 많은 함수를 재정의할 수 있습니다. 이 첫 번째 집합을 재정의하여 분할자 창의 다양한 그래픽 구성 요소에 대한 대체 이미지를 제공할 수 있습니다.

  • virtual void OnDrawSpltter(CDC* pDC, ESplitType nType, const CRect& rect);

  • virtual void OnInvertTracker(const CRect& rect);

이 함수를 호출하여 공유 스크롤 막대 컨트롤을 만듭니다. 스크롤 막대 옆에 추가 컨트롤을 만들도록 재정의할 수 있습니다.

  • virtual BOOL CreateScrollBarCtrl(DWORD dwStyle, UINT nID);

이러한 함수는 동적 분할자 창의 논리를 구현합니다. 보다 고급 분할자 논리를 제공하도록 이를 재정의하거나 덮어쓸 수 있습니다.

  • virtual void DeleteView(int row, int col);

  • virtual BOOL SplitRow(int cyBefore);

  • virtual BOOL SplitColumn(int cxBefore);

  • virtual void DeleteRow(int rowDelete);

  • virtual void DeleteColumn(int colDelete);

CView 기능

클래스는 CView 다음 상위 수준 명령을 사용하여 CSplitterWnd 구현에 위임합니다. 이러한 명령은 가상이므로 표준 CView 구현에서 전체 CSplitterWnd 구현을 연결할 필요가 없습니다. CView를 사용하지만 CSplitterWnd를 사용하지 않는 애플리케이션의 경우, CSplitterWnd 구현은 애플리케이션과 연결되지 않습니다.

  • virtual BOOL CanActivateNext(BOOL bPrev = FALSE);

    현재 ID_NEXT_PANE 또는 ID_PREV_PANE 가능한지 확인합니다.

  • virtual void ActivateNext(BOOL bPrev = FALSE);

    "다음 창" 또는 "이전 창" 명령을 실행합니다.

  • virtual BOOL DoKeyboardSplit();

    키보드 분할 명령(일반적으로 "창 분할")을 실행합니다.

참고하십시오

숫자로 된 기술 노트
범주별 기술 정보