40
Visual C++ Programming Dialog Department of Digital Contents Sang Il Park

Visual C++ Programming Dialog

Embed Size (px)

DESCRIPTION

Visual C++ Programming Dialog. Department of Digital Contents Sang Il Park. Document/View Architecture. 도큐먼트 / 뷰 구조 (1/9). 도큐먼트와 뷰 디스크에 저장된 파일을 읽는 경우. 도큐먼트 객체. 뷰 객체. 파일. 사용자. 도큐먼트 / 뷰 구조 (2/9). 도큐먼트와 뷰 사용자가 데이터를 입력하는 경우. 도큐먼트 객체. 뷰 객체. 파일. 사용자. 도큐먼트 / 뷰 구조 (3/9). 도큐먼트와 뷰 - PowerPoint PPT Presentation

Citation preview

Page 1: Visual C++ Programming  Dialog

Visual C++ Programming Dialog

Department of Digital Contents

Sang Il Park

Page 2: Visual C++ Programming  Dialog

Document/View Architecture

Page 3: Visual C++ Programming  Dialog

3

도큐먼트 /뷰 구조 (1/9)

• 도큐먼트와 뷰– 디스크에 저장된 파일을 읽는 경우

파일

도큐먼트 객체

뷰 객체사용자

Page 4: Visual C++ Programming  Dialog

4

도큐먼트 /뷰 구조 (2/9)

파일

• 도큐먼트와 뷰– 사용자가 데이터를 입력하는 경우

도큐먼트 객체

뷰 객체사용자

Page 5: Visual C++ Programming  Dialog

5

도큐먼트 /뷰 구조 (3/9)

파일

• 도큐먼트와 뷰– 입력된 문서를 디스크 파일로 저장하는 경우

도큐먼트 객체

뷰 객체사용자

Page 6: Visual C++ Programming  Dialog

6

도큐먼트 /뷰 구조 (4/9)

• 도큐먼트와 뷰 클래스의 역할

클래스 역할

도큐먼트 데이터를 저장하거나 읽어들인다 .데이터의 변경 사항이 생기면 뷰의 화면을 갱신한다 .

뷰 데이터를 화면에 표시한다 .사용자와의 상호 작용을 담당한다 .

Page 7: Visual C++ Programming  Dialog

7

도큐먼트 /뷰 구조 (2/6)

• 도큐먼트 /뷰 구조의 장점– 서로 다른 기능을 도큐먼트와 뷰 클래스로 분리해서

구현하기 때문에 개념적으로 이해하기 쉽다 . – 하나의 도큐먼트에 여러 개의 뷰가 존재하는 모델을

구현하기가 쉽다 .• 예 ) 비주얼 C++ 편집창

– MFC 에서 도큐먼트 /뷰 구조를 위해 제공하는 부가적인 서비스를 이용할 수 있다 . • 예 ) 직렬화

Page 8: Visual C++ Programming  Dialog

8

도큐먼트 /뷰 구조 (3/6)

• SDI 와 MDI– 다룰 수 있는 문서의 개수에 따라 구분

Page 9: Visual C++ Programming  Dialog

9

도큐먼트 /뷰 구조 (4/6)

• 도큐먼트 템플릿– 도큐먼트 , 프레임 윈도우 , 뷰 클래스 정보를 유지– 필요에 따라 해당 객체를 동적으로 생성

• MFC 클래스 계층도

SDIMDI

Page 10: Visual C++ Programming  Dialog

10

도큐먼트 /뷰 구조 (5/6)

• InitInstance() 함수

BOOL CExFileApp::InitInstance(){ ... CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CExFileDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CExFileView)); AddDocTemplate(pDocTemplate); ...}

Page 11: Visual C++ Programming  Dialog

11

도큐먼트 /뷰 구조 (6/6)

• 주요 객체의 관계

생성 주체 생성되는 것 ①응용 프로그램 객체 ②도큐먼트 템플릿 객체 도큐먼트 템플릿 객체 ③도큐먼트 객체 , ④ 프레임 윈도우 객체 프레임 윈도우 객체 ⑤뷰 객체

Page 12: Visual C++ Programming  Dialog

12

도큐먼트 /뷰 구조 응용 프로그램 예제 작성 (1/5)

• 프로젝트 생성 ( 단일문서 + 문서 /뷰 아키텍쳐 )

Page 13: Visual C++ Programming  Dialog

13

도큐먼트 /뷰 구조 응용 프로그램 예제 작성 (2/5)

• 고급기능 옵션 설정– ActiveX controls 선택 해제

Page 14: Visual C++ Programming  Dialog

14

도큐먼트 /뷰 구조 응용 프로그램 예제 작성 (3/5)

• 코드 추가

void CExFileView::OnDraw(CDC* pDC){ CExFileDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->SetMapMode(MM_LOMETRIC); pDC->Ellipse(100, -100, 600, -600);}

Page 15: Visual C++ Programming  Dialog

15

도큐먼트 /뷰 구조 응용 프로그램 예제 작성 (4/5)

• 실행 결과

Page 16: Visual C++ Programming  Dialog

16

도큐먼트 /뷰 구조 응용 프로그램 예제 작성 (5/5)

• 실행 결과 (cont'd)

Page 17: Visual C++ Programming  Dialog

17

SDI 응용 프로그램 구조 (1/11)

• SDI 응용 프로그램 구조 1

응용 프로그램(CWinApp)

도큐먼트 템플릿(CSingleDocTemplate)

도큐먼트(CDocument)

뷰(CView)

프레임 윈도우(CFrameWnd)

Page 18: Visual C++ Programming  Dialog

18

SDI 응용 프로그램 구조 (2/11)

• SDI 응용 프로그램 구조 2

응용 프로그램(CWinApp)

도큐먼트 템플릿(CSingleDocTemplate)

도큐먼트(CDocument)

뷰(CView)

프레임 윈도우(CFrameWnd)

뷰(CView)

Page 19: Visual C++ Programming  Dialog

19

SDI 응용 프로그램 구조 (3/11)

• 도큐먼트 프레임 윈도우– 도큐먼트의 내용을 화면에 표시하는 역할을 하는 뷰를

자식으로 갖는 윈도우 = 뷰의 부모 윈도우 = 뷰를 감싸고 있는 윈도우

메인 윈도우 = 도큐먼트 프레임 윈도우

메인 윈도우

도큐먼트 프레임 윈도우

Page 20: Visual C++ Programming  Dialog

SDI 응용 프로그램 구조 (4/11)

• 주요 객체 사이의 참조

도큐먼트 뷰

도큐먼트프레임 윈도우

GetFirstViewPosition& GetNextView

GetDocument

GetActiveDocumentGetActiveView

응용 프로그램

AfxGetMainWnd

AfxGetApp

m_pMainWnd

GetParentFrame

도큐먼트템플릿

GetFirstDocTemplatePosition& GetNextDocTemplate

GetDocTemplate

GetFirstDocPosition& GetNextDoc

Page 21: Visual C++ Programming  Dialog

21

SDI 응용 프로그램 구조 (5/11)

• 함수 요약– CWinApp* AfxGetApp ( );

• 응용 프로그램 객체의 주소를 리턴

– CWnd* AfxGetMainWnd ( );• 메인 윈도우 객체의 주소를 리턴

– CFrameWnd* CWnd::GetParentFrame ( );• 프레임 윈도우 객체의 주소를 리턴

– CView* CFrameWnd::GetActiveView ( ); • 활성 뷰 객체의 주소를 리턴

Page 22: Visual C++ Programming  Dialog

22

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

Page 23: Visual C++ Programming  Dialog

23

SDI 응용 프로그램 구조 (7/11)

• 함수 요약 (cont'd)– POSITION

CWinApp::GetFirstDocTemplatePosition ( );CDocTemplate* CWinApp::GetNextDocTemplate (POSITION& pos);• 응용 프로그램 객체가 관리하는 모든 도큐먼트 템플릿 객체의

주소를 리턴

응용 프로그램 객체m_templateList

도큐먼트템플릿

객체 #1

도큐먼트템플릿

객체 #2

도큐먼트템플릿

객체 #3

NULL

Page 24: Visual C++ Programming  Dialog

24

SDI 응용 프로그램 구조 (8/11)

• 함수 요약 (cont'd)– POSITION CDocTemplate::GetFirstDocPosition (

);CDocument* CDocTemplate::GetNextDoc (POSITION& rPos);• 도큐먼트 템플릿 객체가 관리하는 모든 도큐먼트 객체의

주소를 리턴

– CDocTemplate* CDocument::GetDocTemplate ( ); • 도큐먼트 객체와 연결된 도큐먼트 템플릿 객체의

주소를 리턴

도큐먼트 템플릿 객체m_docList

도큐먼트객체 #1

도큐먼트객체 #2

도큐먼트객체 #3

NULL

Page 25: Visual C++ Programming  Dialog

문서 /뷰 구조 좀 더 자세히 보기

• 단일 문서를 다시 만든다 . – 문서 템플릿 문자열을 편집

Page 26: Visual C++ Programming  Dialog

26

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);

Page 27: Visual C++ Programming  Dialog

27

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;}

Page 28: Visual C++ Programming  Dialog

28

SDI 응용 프로그램 구조 (11/11)

• 도큐먼트 문자열

ExSDI\n\nExSDI\nExSDI 파일 (*.sdi)\n.sdi\nExSDI.Document

① ② ③ ④ ⑤ ⑥\nExSDI Document ⑦

Page 29: Visual C++ Programming  Dialog

29

도큐먼트 클래스 (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()

도큐먼트 객체

뷰 객체

Page 30: Visual C++ Programming  Dialog

30

도큐먼트 클래스 (2/3)

• 주요 함수 (cont'd)– virtual BOOL OnNewDocument ( );

• 새 문서를 생성할 때 자동으로 호출

– virtual BOOL OnOpenDocument (LPCTSTR lpszPathName); • 파일을 열 때 자동으로 호출

– virtual void DeleteContents ( ); • 새로운 문서를 생성하거나 파일을 열 때 자동으로 호출

– virtual void Serialize (CArchive& ar); • 파일을 열거나 저장할 때 자동으로 호출

Page 31: Visual C++ Programming  Dialog

31

도큐먼트 클래스 (3/3)

• 가상 함수 호출 순서– [ 파일 ]->[ 새 파일 ] 메뉴 항목을 선택할 때

– [ 파일 ]->[ 열기 ...] 메뉴 항목을 선택할 때

– [ 파일 ]->[ 저장 ] 또는 [ 파일 ]->[ 다른 이름으로 저장 ...] 메뉴 항목을 선택할 때

DeleteContents() OnNewDocument()

DeleteContents() Serialize() OnOpenDocument()

Serialize()

Page 32: Visual C++ Programming  Dialog

32

뷰 클래스

• 주요 함수– virtual void OnDraw (CDC* pDC);

• 화면 출력 , 인쇄 , 인쇄 미리보기를 할 때 자동으로 호출

– virtual void OnInitialUpdate();• 뷰 객체가 도큐먼트 객체와 연결된 후 화면에 보이기 전에

자동으로 호출

– virtual void OnUpdate (CView* pSender, LPARAM lHint, CObject* pHint); • CDocument::UpdateAllViews() 함수와

CView::OnInitialUpdate() 함수에서 호출

Page 33: Visual C++ Programming  Dialog

코딩연습

• Document/View 구조를 사용하여 원을 그리고 , 저장 /로드 하는 프로그램을 만들자 .

고쳐야 하는 부분

CView::OnDraw()

CDocument::OnNewDocument()Serialize()

고쳐야 하는 부분

CView::OnDraw()

CDocument::OnNewDocument()Serialize()

Page 34: Visual C++ Programming  Dialog

34

명령 라우팅 (1/2)

• MFC 응용 프로그램에서 사용하는 메시지 종류

Page 35: Visual C++ Programming  Dialog

35

명령 라우팅 (2/2)

• 명령 라우팅 순서

④ 프레임 윈도우명령 메시지명령 갱신 메시지

② 활성 도큐먼트

① 활성 뷰

③ 도큐먼트 템플릿

⑤ 응용 프로그램 객체

⑥ ::DefWindowProc()

Page 36: Visual C++ Programming  Dialog

36

분할 윈도우 (1/4)

• 동적 분할 윈도우– 같은 뷰 클래스를 기반으로 여러 개의 뷰를 생성– 총 네 개의 구획 (Pane) 생성 가능

Page 37: Visual C++ Programming  Dialog

37

분할 윈도우 (2/4)

• 동적 분할 윈도우 구현

Page 38: Visual C++ Programming  Dialog

분할 윈도우 (2/4)

• 동적 분할 윈도우로 다양한 내용 출력하기 :1. 현재의 뷰가 어떠한 어떤 pane 에 속하는지 판단

2. 각 pane 에 따라 출력한 내용을 달리한다 .

bool CSpliterWnd::IsChildPane ( CWnd * wnd, int * row, int * col )bool CSpliterWnd::IsChildPane ( CWnd * wnd, int * row, int * col )

if (col == 0) { … }Else if (col == 1) { …,}

if (col == 0) { … }Else if (col == 1) { …,}

Page 39: Visual C++ Programming  Dialog

39

분할 윈도우 (3/4)

• 정적 분할 윈도우– 서로 다른 뷰 클래스를 기반으로 여러 개의 뷰를 생성– 총 256 개의 구획 생성 가능

Page 40: Visual C++ Programming  Dialog

40

분할 윈도우 (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), CSize(300, 200), pContext); SetActiveView((CView *)m_wndSplitter.GetPane(0, 0));

return TRUE;}