티스토리 뷰

프로그래밍/MFC

MFC 화면 분할

에어버스 2016. 7. 3. 16:10

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,
        22,               // TODO: 행 및 열의 개수를 조정합니다.
        CSize(1010),      // 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);
}                                                     Colored by Color Scripter
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(this21); // 정적 분할 윈도우로 분할
    m_wndSplitter.CreateView(00, RUNTIME_CLASS(CMFCApplication12View), CSize(300200), pContext);
    m_wndSplitter.CreateView(10, RUNTIME_CLASS(CDrawView), CSize(300200), pContext);
    SetActiveView((CView*)m_wndSplitter.GetPane(00));
    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 참고

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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