티스토리 뷰
프로그램에서 사용할 데이터를 관리하는 부분과 이 데이터를 실제로 화면에 표시하는 부분을 서로 다른 모듈로 구현한다는 개념을 기초로 한다.
- 도큐먼트(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 클래스명이 다름)