Download presentation
Presentation is loading. Please wait.
1
Visual C++ Programming Document/View Architecture
Department of Digital Contents Sang Il Park
2
도큐먼트/뷰 구조 (1/6) 도큐먼트와 뷰 클래스의 역할 클래스 역할 도큐먼트 데이터를 저장하거나 읽어들인다.
데이터의 변경 사항이 생기면 뷰의 화면을 갱신한다. 뷰 데이터를 화면에 표시한다. 사용자와의 상호 작용을 담당한다.
3
도큐먼트/뷰 구조 (2/6) 도큐먼트/뷰 구조의 장점
서로 다른 기능을 도큐먼트와 뷰 클래스로 분리해서 구현하기 때문에 개념적으로 이해하기 쉽다. 하나의 도큐먼트에 여러 개의 뷰가 존재하는 모델을 구현하기가 쉽다. 예) 비주얼 C++ 편집창 MFC에서 도큐먼트/뷰 구조를 위해 제공하는 부가적인 서비스를 이용할 수 있다. 예) 직렬화
4
도큐먼트/뷰 구조 (3/6) SDI와 MDI 다룰 수 있는 문서의 개수에 따라 구분
5
도큐먼트/뷰 구조 (4/6) 도큐먼트 템플릿 MFC 클래스 계층도 도큐먼트, 프레임 윈도우, 뷰 클래스 정보를 유지
필요에 따라 해당 객체를 동적으로 생성 MFC 클래스 계층도 SDI MDI
6
도큐먼트/뷰 구조 (5/6) InitInstance() 함수 BOOL CExFileApp::InitInstance() {
... CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CExFileDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CExFileView)); AddDocTemplate(pDocTemplate); }
7
도큐먼트/뷰 구조 (6/6) 주요 객체의 관계 생성 주체 생성되는 것 ①응용 프로그램 객체 ②도큐먼트 템플릿 객체
③도큐먼트 객체, ④프레임 윈도우 객체 프레임 윈도우 객체 ⑤뷰 객체
8
도큐먼트/뷰 구조 응용 프로그램 예제 작성 (1/5)
도큐먼트/뷰 구조 응용 프로그램 예제 작성 (1/5) 프로젝트 생성 (단일문서 + 문서/뷰 아키텍쳐)
9
도큐먼트/뷰 구조 응용 프로그램 예제 작성 (2/5)
도큐먼트/뷰 구조 응용 프로그램 예제 작성 (2/5) 고급기능 옵션 설정 ActiveX controls 선택 해제
10
도큐먼트/뷰 구조 응용 프로그램 예제 작성 (3/5)
도큐먼트/뷰 구조 응용 프로그램 예제 작성 (3/5) 코드 추가 void CExFileView::OnDraw(CDC* pDC) { CExFileDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->SetMapMode(MM_LOMETRIC); pDC->Ellipse(100, -100, 600, -600); }
11
도큐먼트/뷰 구조 응용 프로그램 예제 작성 (4/5)
도큐먼트/뷰 구조 응용 프로그램 예제 작성 (4/5) 실행 결과
12
도큐먼트/뷰 구조 응용 프로그램 예제 작성 (5/5)
도큐먼트/뷰 구조 응용 프로그램 예제 작성 (5/5) 실행 결과 (cont'd)
13
(CSingleDocTemplate)
SDI 응용 프로그램 구조 (1/11) SDI 응용 프로그램 구조 1 응용 프로그램 (CWinApp) 프레임 윈도우 (CFrameWnd) 도큐먼트 템플릿 (CSingleDocTemplate) 도큐먼트 (CDocument) 뷰 (CView)
14
(CSingleDocTemplate)
SDI 응용 프로그램 구조 (2/11) SDI 응용 프로그램 구조 2 응용 프로그램 (CWinApp) 도큐먼트 템플릿 (CSingleDocTemplate) 도큐먼트 (CDocument) 뷰 (CView) 프레임 윈도우 (CFrameWnd)
15
SDI 응용 프로그램 구조 (3/11) 도큐먼트 프레임 윈도우
도큐먼트의 내용을 화면에 표시하는 역할을 하는 뷰를 자식으로 갖는 윈도우 = 뷰의 부모 윈도우 = 뷰를 감싸고 있는 윈도우 메인 윈도우 메인 윈도우 = 도큐먼트 프레임 윈도우 도큐먼트 프레임 윈도우
16
GetFirstViewPosition GetFirstDocTemplatePosition
SDI 응용 프로그램 구조 (4/11) 주요 객체 사이의 참조 도큐먼트 뷰 프레임 윈도우 GetFirstViewPosition & GetNextView GetDocument GetActiveDocument GetActiveView 응용 프로그램 AfxGetMainWnd AfxGetApp m_pMainWnd GetParentFrame 템플릿 GetFirstDocTemplatePosition & GetNextDocTemplate GetDocTemplate GetFirstDocPosition & GetNextDoc
17
SDI 응용 프로그램 구조 (5/11) 함수 요약 CWinApp* AfxGetApp ( );
응용 프로그램 객체의 주소를 리턴 CWnd* AfxGetMainWnd ( ); 메인 윈도우 객체의 주소를 리턴 CFrameWnd* CWnd::GetParentFrame ( ); 프레임 윈도우 객체의 주소를 리턴 CView* CFrameWnd::GetActiveView ( ); 활성 뷰 객체의 주소를 리턴
18
SDI 응용 프로그램 구조 (6/11) 함수 요약 (cont'd)
CDocument* CFrameWnd::GetActiveDocument ( ); 활성 도큐먼트 객체의 주소를 리턴 CDocument* CView::GetDocument ( ); 뷰 객체와 연결된 도큐먼트 객체의 주소를 리턴 POSITION CDocument::GetFirstViewPosition ( ); CView* CDocument::GetNextView (POSITION& rPosition); 도큐먼트 객체와 연결된 모든 뷰 객체의 주소를 리턴 도큐먼트 객체 m_viewList 뷰 객체#1 뷰 객체#2 뷰 객체#3 NULL
19
SDI 응용 프로그램 구조 (7/11) 함수 요약 (cont'd)
POSITION CWinApp::GetFirstDocTemplatePosition ( ); CDocTemplate* CWinApp::GetNextDocTemplate (POSITION& pos); 응용 프로그램 객체가 관리하는 모든 도큐먼트 템플릿 객체의 주소를 리턴 응용 프로그램 객체 m_templateList 도큐먼트 템플릿 객체#1 객체#2 객체#3 NULL
20
SDI 응용 프로그램 구조 (8/11) 함수 요약 (cont'd)
POSITION CDocTemplate::GetFirstDocPosition ( ); CDocument* CDocTemplate::GetNextDoc (POSITION& rPos); 도큐먼트 템플릿 객체가 관리하는 모든 도큐먼트 객체의 주소를 리턴 CDocTemplate* CDocument::GetDocTemplate ( ); 도큐먼트 객체와 연결된 도큐먼트 템플릿 객체의 주소를 리턴 도큐먼트 템플릿 객체 m_docList 도큐먼트 객체#1 객체#2 객체#3 NULL
21
문서/뷰 구조 좀 더 자세히 보기 단일 문서를 다시 만든다. 문서 템플릿 문자열을 편집
22
SDI 응용 프로그램 구조 (9/11) InitInstance() 함수 BOOL CExSDIApp::InitInstance()
{ ... ① SetRegistryKey(_T("Local AppWizard-Generated Applications")); ② LoadStdProfileSettings(); CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CExSDIDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CExSDIView)); AddDocTemplate(pDocTemplate);
23
SDI 응용 프로그램 구조 (10/11) InitInstance() 함수 (cont'd) ③ EnableShellOpen();
④ RegisterShellFileTypes(TRUE); CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); if (!ProcessShellCommand(cmdInfo)) return FALSE; m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); ⑤ m_pMainWnd->DragAcceptFiles(); return TRUE; }
24
SDI 응용 프로그램 구조 (11/11) 도큐먼트 문자열
ExSDI\n\nExSDI\nExSDI 파일 (*.sdi)\n.sdi\nExSDI.Document ① ② ③ ④ ⑤ ⑥ \nExSDI Document ⑦
25
도큐먼트 클래스 (1/3) 주요 함수 void SetModifiedFlag (BOOL bModified = TRUE);
도큐먼트 객체가 유지하는 데이터를 수정한 경우 호출 void UpdateAllViews (CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL); 도큐먼트 객체와 연결된 모든 뷰의 화면을 갱신 CDocument::UpdateAllViews() CWnd::Invalidate() CView::OnUpdate() CWnd::OnPaint() CView::OnDraw() 도큐먼트 객체 뷰 객체
26
도큐먼트 클래스 (2/3) 주요 함수 (cont'd) virtual BOOL OnNewDocument ( );
새 문서를 생성할 때 자동으로 호출 virtual BOOL OnOpenDocument (LPCTSTR lpszPathName); 파일을 열 때 자동으로 호출 virtual void DeleteContents ( ); 새로운 문서를 생성하거나 파일을 열 때 자동으로 호출 virtual void Serialize (CArchive& ar); 파일을 열거나 저장할 때 자동으로 호출
27
도큐먼트 클래스 (3/3) 가상 함수 호출 순서 [파일]->[새 파일] 메뉴 항목을 선택할 때
[파일]->[열기...] 메뉴 항목을 선택할 때 [파일]->[저장] 또는 [파일]->[다른 이름으로 저장...] 메뉴 항목을 선택할 때 DeleteContents() OnNewDocument() DeleteContents() Serialize() OnOpenDocument() Serialize()
28
뷰 클래스 주요 함수 virtual void OnDraw (CDC* pDC);
화면 출력, 인쇄, 인쇄 미리보기를 할 때 자동으로 호출 virtual void OnInitialUpdate(); 뷰 객체가 도큐먼트 객체와 연결된 후 화면에 보이기 전에 자동으로 호출 virtual void OnUpdate (CView* pSender, LPARAM lHint, CObject* pHint); CDocument::UpdateAllViews() 함수와 CView::OnInitialUpdate() 함수에서 호출
29
코딩연습 Document/View 구조를 사용하여 원을 그리고, 저장/로드 하는 프로그램을 만들자. 고쳐야 하는 부분
CView:: OnDraw() CDocument:: OnNewDocument() Serialize()
30
명령 라우팅 (1/2) MFC 응용 프로그램에서 사용하는 메시지 종류
31
명령 라우팅 (2/2) 명령 라우팅 순서 ⑥ ::DefWindowProc() ⑤ 응용 프로그램 객체 명령 메시지
④ 프레임 윈도우 명령 메시지 명령 갱신 메시지 ② 활성 도큐먼트 ① 활성 뷰 ③ 도큐먼트 템플릿 ⑤ 응용 프로그램 객체 ⑥ ::DefWindowProc()
32
분할 윈도우 (1/4) 동적 분할 윈도우 같은 뷰 클래스를 기반으로 여러 개의 뷰를 생성
총 네 개의 구획(Pane) 생성 가능
33
분할 윈도우 (2/4) 동적 분할 윈도우 구현
34
분할 윈도우 (3/4) 정적 분할 윈도우 서로 다른 뷰 클래스를 기반으로 여러 개의 뷰를 생성 총 256개의 구획 생성 가능
35
분할 윈도우 (4/4) 정적 분할 윈도우 구현 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext) { m_wndSplitter.CreateStatic(this, 2, 1); m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CFirstView), CSize(300, 200), pContext); m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CSecondView), SetActiveView((CView *)m_wndSplitter.GetPane(0, 0)); return TRUE; }
36
MDI 응용 프로그램 구조 (1/8) MDI 응용 프로그램 기본 구조 응용 프로그램 (CWinApp) 도큐먼트 템플릿
(CMultiDocTemplate) 도큐먼트 (CDocument) 뷰 (CView) 도큐먼트 프레임 윈도우 (CMDIChildWnd) 메인 윈도우 (CMDIFrameWnd)
37
MDI 응용 프로그램 구조 (2/8) MDI 응용 프로그램 일반 구조 1 응용 프로그램 객체 도큐먼트 템플릿 도큐먼트 객체 2
뷰 객체 2 도큐먼트 객체 1 뷰 객체 1 도큐먼트 객체 3 뷰 객체 3
38
MDI 응용 프로그램 구조 (3/8) SDI와 MDI 응용 프로그램 비교
도큐먼트 템플릿으로 CSingleDocTemplate 클래스 대신 CMultiDocTemplate 클래스 사용 SDI 응용 프로그램과 달리 MDI 응용 프로그램은 도큐먼트 객체를 재사용하지 않고 매번 새로 생성 MDI 응용 프로그램에서는 메인 윈도우와 도큐먼트 프레임 윈도우가 별개이며 각각 CMDIFrameWnd, CMDIChildWnd 클래스 사용
39
MDI 응용 프로그램 구조 (4/8) InitInstance() 함수 BOOL CExMDIApp::InitInstance()
{ ... CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_EXMDITYPE, RUNTIME_CLASS(CExMDIDoc), RUNTIME_CLASS(CChildFrame), // 도큐먼트 프레임 윈도우 RUNTIME_CLASS(CExMDIView)); AddDocTemplate(pDocTemplate); CMainFrame* pMainFrame = new CMainFrame; // 메인 윈도우 if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; }
40
MDI 응용 프로그램 구조 (5/8) 주요 객체 사이의 참조 AfxGetMainWnd AfxGetApp
GetFirstViewPosition & GetNextView GetDocument GetActiveDocument GetActiveView GetParentFrame 도큐먼트 프레임 윈도우 응용 프로그램 메인 윈도우 뷰 템플릿 GetFirstDocTemplatePosition & GetNextDocTemplate GetDocTemplate m_pMainWnd GetFirstDocPosition & GetNextDoc MDIGetActive 또는 GetActiveFrame
41
MDI 응용 프로그램 구조 (6/8) 함수 요약 CMDIChildWnd* CMDIFrameWnd::MDIGetActive (BOOL* pbMaximized = NULL); CFrameWnd* CFrameWnd::GetActiveFrame ( ); 활성 도큐먼트 프레임 윈도우 객체의 주소를 리턴
42
MDI 응용 프로그램 구조 (7/8) MDI 응용 프로그램 특징
[파일]->[새 파일] 메뉴 항목을 선택하면 새로운 도큐먼트, 도큐먼트 프레임 윈도우, 뷰 객체가 생성 [창]->[다음 창] 메뉴 항목을 선택하면 활성 도큐먼트에 대한 뷰를 추가로 생성 가능 최소 두 개의 메뉴 사용
43
MDI 응용 프로그램 구조 (8/8) MDI 응용 프로그램 일반 구조 2 응용 프로그램 객체 도큐먼트 템플릿 도큐먼트 객체 2
뷰 객체 2 도큐먼트 객체 1 뷰 객체 1 도큐먼트 객체 3 뷰 객체 3 뷰 객체 4
44
다양한 도큐먼트 타입 지원 (1/2) MDI 응용 프로그램 일반 구조 3 두 개 이상의 도큐먼트 타입 지원 응용 프로그램 객체
도큐먼트 템플릿 1 도큐먼트 객체 2 뷰 객체 2 도큐먼트 객체 1 뷰 객체 1 도큐먼트 객체 3 뷰 객체 3 도큐먼트 템플릿 2 도큐먼트 객체 4 뷰 객체 4 뷰 객체 5
45
다양한 도큐먼트 타입 지원 (2/2) 새로운 도큐먼트 타입 추가 ① 새로운 도큐먼트와 뷰 클래스를 생성하고 구현 코드 작성
① 새로운 도큐먼트와 뷰 클래스를 생성하고 구현 코드 작성 ② 아이콘, 메뉴, 도큐먼트 문자열 등 리소스를 추가 ③ InitInstance() 함수 수정
Similar presentations