티스토리 뷰
MFC 분할 윈도우 (Splitter Windows)
하나의 도큐먼트에 대해 뷰가 여러개인 윈도우
- 분할 윈도우 종류
1. 동적 분할 윈도우 (Dynamic Splitter Windows)
같은 뷰 클래스 기반으로 여러 개의 뷰가 생성되며, 사용자가 윈도우를 임의로 분할하거나 다시 합칠 수 있다.
분할할 수 있는 최대 개수는 가로, 세로 각 2개씩 총 4개의 구획을 생성할 수 있다.
예) VC++ 편집 윈도우
2. 정적 분할 윈도우 (Static Splitter Windows)
서로 다른 뷰 클래스를 기반으로 여러개의 뷰를 생성하며, 각 뷰가 서로 다른 목적으로 사용된다.
분할은 가로, 세로 각각 최대 16개로 총 256개의 구획을 생성할 수 있다.
예) VC++ 아이콘 편집기
프로젝트 생성시 아래 그림처럼 '분할 창' 을 선택한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 |
class CMainFrame : public CFrameWnd
{
...
protected:
CSplitterWnd m_wndSplitter;
};
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{ // 분할 창을 선택하면 자동으로 코드 만들어 진다.
return m_wndSplitter.Create(this,
2, 2, // TODO: 행 및 열의 개수를 조정합니다.
CSize(10, 10), // TODO: 최소 창 크기를 조정합니다.
pContext);
}
class CMFCApplication12Doc : public CDocument
{
...
public:
CString m_str;
};
BOOL CMFCApplication12Doc::OnNewDocument()
{
...
m_str = L"";
return TRUE;
}
BEGIN_MESSAGE_MAP(CMFCApplication12View, CView)
...
ON_WM_CHAR()
END_MESSAGE_MAP()
void CMFCApplication12View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CMFCApplication12Doc* pDoc = GetDocument();
pDoc->m_str.AppendChar(nChar);
pDoc->UpdateAllViews(NULL);
CView::OnChar(nChar, nRepCnt, nFlags);
}
void CMFCApplication12View::OnDraw(CDC* pDC)
{
...
CRect rect;
GetClientRect(&rect);
pDC->DrawText(pDoc->m_str, &rect, DT_LEFT);
|
cs |
실행하면 보기 메뉴에 분할 메뉴 항목이 자동 추가되어 있다.
분할 메뉴를 선택하면 아래 그림처럼 분할 영역 크기 조정이 가능하다.
위 프로젝트에서 아래 그림처럼 CView를 상속받는 CDrawView 클래스를 추가한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 |
class CDrawView : public CView
{
...
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};
BEGIN_MESSAGE_MAP(CDrawView, CView)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
CClientDC dc(this);
dc.SelectStockObject(LTGRAY_BRUSH);
dc.Rectangle(point.x - 20, point.y - 20, point.x + 20, point.y + 20);
CView::OnLButtonDown(nFlags, point);
}
#include "MFCApplication12Doc.h"
#include "MFCApplication12View.h"
#include "DrawView.h"
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{
m_wndSplitter.CreateStatic(this, 2, 1); // 정적 분할 윈도우로 분할
m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMFCApplication12View), CSize(300, 200), pContext);
m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CDrawView), CSize(300, 200), pContext);
SetActiveView((CView*)m_wndSplitter.GetPane(0, 0));
return TRUE;
}
|
cs |
CMainFrame::OnCreateClient() 를 보면 뷰를 2행 1열로 분할해서 위쪽(0,0)은 기존 프로젝트 처럼 키 입력을 받아 출력하는 뷰로 지정하고, 아래(1,0)는 새로 만든 CDrawView 로 지정해서 사각형을 그리도록 했다.
이 처럼 위, 아래 서로 다른 뷰를 만들때는 정적 분할 윈도우(CreateStatic())를 사용한다.
RUNTIME_CLASS() 매크로를 이용해서 각 클래스 객체를 실행시간(실시간) 등록해준다.
<화면 부할 시 뷰의 각 구획 구분 번호> (배열과 같음)
(0, 0) |
(0, 1) |
(1, 0) |
(1, 1) |
RUNTIME_CLASS() 설명은 http://petra.tistory.com/930 참고