티스토리 뷰

프로그래밍/MFC

MFC Document/View 구조

에어버스 2016. 6. 25. 10:32
Document/View 구조

프로그램에서 사용할 데이터를 관리하는 부분과 이 데이터를 실제로 화면에 표시하는 부분을 서로 다른 모듈로 구현한다는 개념을 기초로 한다.

- 도큐먼트(Document) : 데이터를 관리는 기능을 구현한 클래스
데이터를 저장하거나 읽어 들인다.
데이터의 변경 사항이 생기면 뷰의 화면을 갱신한다.

- 뷰(View) : 데이터를 화면에 표시하는 기능을 구현한 클래스
데이타를 화면에 표시한다.
사용자와 상호 작용을 담당한다.

장점>

1. 서로 다른 기능을 도큐먼트와 뷰로 분리해서 구현하기 때문에 개념적으로 이해가 쉽다.
2. 1개의 도큐먼트에 여러개의 뷰가 존재하는 모델 구현이 쉽다. (화면(뷰) 분할)
3. 직렬화 등 부가적인 서비스 이용할 수 있다.

종류>

SDI (Single-Document Interface)
하나의 문서만 작업 가능 (뷰가 1개)

MDI (Multiple-Document Interface)
여러개의 문서를 대상으로 동시에 작업 가능 (뷰가 여러개)

도큐먼트 템플릿은 http://petra.tistory.com/931 참고

주요 객체 생성 관계>

1. 응용프로그램 객체에서 도큐먼트 템플릿 객체가 생성된다.

1
2
3
4
5
6
7
8
CMFCApplication2App theApp; // 외부 변수
 
BOOL CMFCApplication2App::InitInstance()
{
    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(...);
...
};
cs

2. 도큐먼트 템플릿 객체에서 Doc, MainFrame 객체 생성

1
2
3
4
5
6
7
8
9
10
11
BOOL CMFCApplication2App::InitInstance()
{
...
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    if (!ProcessShellCommand(cmdInfo)) // 여기서 Doc, MainFrame, View 객체 생성
        return FALSE;
    m_pMainWnd->ShowWindow(SW_SHOW);
    m_pMainWnd->UpdateWindow();
    return TRUE;
}
cs


3. MainFrame 객체에서 View객체 생성

1
2
3
4
5
6
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1// 뷰도 만든다. 디버깅하면 여기서 뷰의 생성자 호출됨
        return -1;
...
}
cs

 

- onDraw()

1
void CMFCApplication2View::OnDraw(CDC* /*pDC*/)
cs

Doc/View 구조 응용프로그램은 OnPaint() 대신 OnDraw()가 사용된다.
OnDraw()는 DC 객체를 생성할 필요가 없다. - MFC 내부 코드에서 적당한 DC객체를 생성하고 주소를 넘겨주기 때문이다.

화면 출력뿐 아니라 인쇄와 미리보기에도 사용된다.

DC는 모든 장치를 추상화하므로 DC로 출력하는 내용은 모든 출력장치(화면, 프린터 등)의 출력할 수 있다.
이때 주의할 것은 출력장치마다 표현 방식이나 비율이 다를 수 있으니 매핑모드를 잘 선택해야만 한다.

 

만약, 문서/뷰 아키텍처 지원을 해제 하면 아래와 같이 프로젝트가 만들어 진다. (View 클래스명이 다름)

 

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