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
사용하려면 -derived 클래스를 사용하는 경우와 마찬가지로 개체 CreateView
의 RUNTIME_CLASS 함수에 CView
전달합니다. 프레임워크는 런타임에 동적 생성을 사용하므로 클래스는 DECLARE_DYNCREATE 및 IMPLEMENT_DYNCREATE 사용해야 합니다. 클래스와 CSplitterWnd
관련된 CView
코드가 많지만 CObject ::IsKindOf 는 해당 작업을 수행하기 전에 항상 사용됩니다.
분할 막대: 창의 행과 열 사이에 배치되는 컨트롤입니다. 창의 행 또는 열 크기를 조정하는 데 사용할 수 있습니다.
Splitter Box: 창의 새 행 또는 열을 만드는 데 사용할 수 있는 동적 CSplitterWnd
컨트롤입니다. 세로 스크롤 막대의 위쪽 또는 가로 스크롤 막대의 왼쪽에 있습니다.
분할자 교차: 세로 분할 막대와 가로 분할 막대의 교집합입니다. 행 및 창 열의 크기를 동시에 조정하도록 끌어다 놓을 수 있습니다.
공유 스크롤 막대
클래스는 CSplitterWnd
공유 스크롤 막대도 지원합니다. 이러한 스크롤 막대 컨트롤은 해당 컨트롤의 CSplitterWnd
자식이며 분할자의 다른 창과 공유됩니다.
예를 들어 1행 x 2열 창에서 WS_VSCROLL 만들 CSplitterWnd
때 지정할 수 있습니다. Windows는 두 창 간에 공유되는 특수 스크롤 막대 컨트롤을 만듭니다.
[ ][ ][^]
[pane00][pane01][|]
[ ][ ][v]
사용자가 스크롤 막대를 이동하면 WM_VSCROLL 메시지가 두 보기로 전송됩니다. 두 보기 중 하나가 스크롤 막대 위치를 설정하면 공유 스크롤 막대가 설정됩니다.
공유 스크롤 막대는 유사한 뷰 개체에서 가장 유용합니다. 분할자에서 다양한 형식의 보기를 혼합하는 경우 스크롤 위치를 조정하는 특수 코드를 작성해야 할 수 있습니다. 스크롤 막대 API를 CWnd
사용하는 파생 CView
클래스는 있는 경우 공유 스크롤 막대에 위임됩니다. 구현은 CScrollView
공유 스크롤 막대를 CView
지원하는 클래스의 한 예입니다. 파생 CView
되지 않은 클래스, 제어되지 않는 스크롤 막대를 사용하는 클래스 또는 표준 Windows 구현(예 CEditView
: )을 사용하는 클래스는 공유 스크롤 막대 기능 CSplitterWnd
에서 작동하지 않습니다.
최소 크기
각 행에 대해 최소 행 높이가 있으며 각 열에 대해 최소 열 너비가 있습니다. 이 최소값은 창이 너무 작아서 전체 세부 정보를 표시할 수 없도록 보장합니다.
정적 분할자 창의 경우 초기 최소 행 높이와 열 너비는 0입니다. 동적 분할자 창의 경우 초기 최소 행 높이와 열 너비는 함수의 CSplitterWnd::Create
sizeMin 매개 변수에 의해 설정됩니다.
CSplitterWnd::SetRowInfo 및 CSplitterWnd::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();
키보드 분할 명령(일반적으로 "창 분할")을 실행합니다.