Visual C++ Programming Document/View Architecture

Slides:



Advertisements
Similar presentations
일본주식시장의 신 고레가와긴조 투자전략 6 조 안승권. 신문수 발표자 : 신 문 수. 출 생 : 1897 효고현에서 출생 학 력 : 초등학교졸업, 사업가 1992 년 95 세 사망 유일한 자서전 1981 년 스미토모 금속광산 주식매매 200 억엔 벌다⇒ 일본 소득세 납세.
Advertisements

Visual C++ 구성. DevStudio –Visual C++ 를 실행시키면 전면에 뜨는 프로그램. – 텍스트에디터, 리소스에디터, 디버거 등 모든 기능 총괄 MFC(Microsoft Foundation Class) – 윈도우 프로그램을 만드는데 필요한 거의 모든.
CH5 디버그를 해보자 디버그 디버거 : 실행중인 응용 프로그램을 지정한 장소에서 정지하고, 그 시 점에서 변수, 메모리, 콜 스택의 내용을 참조하는것이 가능 Build -> Start Debug -> Go.
Hallym Univ MFC 개요 및 사용법 발표자 : 최 원 민 1 목 차목 차  MFC 의 개요  MFC 프로그램의 구조  SDI(Single Document Interface) 애플리케이션 구조  MDI(Multiple Document Interface)
1 컴퓨터정보과 MFC 의 개요 MFC 윈도우 애플리케이션을 생성하기 위해 만들어진 C++ 클래스 라이브러리 애플리케이션 프레임워크를 제공 MFC 의 이점 윈도우 프로그램 전문가로 만들어 준다. 개발시간을 단축시키고, 이식성이 강한 코드를 작성 ActiveX, OLE,
MFC의 개요 MFC MFC의 이점 윈도우 애플리케이션을 생성하기 위해 만들어진 C++ 클래스 라이브러리
Visual C++ Programming Document/View Architecture Department of Digital Contents Sang Il Park.
다이어그램 그래픽 2003 년도 1 학기말 과제 ( 담당교수 : 최병수 교수님 ) 제출자 : 조한진 이영수 이호진 동아일보에 사용된 그래프의 오남용 사례 분석.
CH1 개발 효율이 높은 프로그램 구조
미디어 프로그래밍 II 소개.
프로젝트 보고서 학과 : 임학과 학번 : 성명 : 조성환 Windows 프로그래밍.
컴퓨터 공학 설계 및 실험 I MFC programming
2009개정 중등 국어과 교육과정 울산광역시교육청 교육과정 컨설팅단 : 정일진.
아름다운 이들의 행복한 길음안나의 집.
달라지는 노동법 개정 내용 노무법인 正道 잠시나마… 주요 노동관계법 개정내용 3. 마무리 Contents
Chapter 02. C언어 기반의 C++ 박 종 혁 교수 UCS Lab SeoulTech Tel:
Visual C++ Programming
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷 MFC 응용 프로그램 마법사를 이용한 MFC 프로젝트 작성
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다.
MFC Application Frameworks (AFX)
Lecture 2 MFC and Application Frameworks
Visual C++ Programming Dialog Box
Lab 10 Guide: 프린터 출력 예제. 한 페이지의 그림 인쇄 (교재 24장, 쪽)
Chapter 1 윈도우 프로그래밍 들어가기 윈도우 응용 프로그램을 작성하기 위해 필요한 기본 개념을 정립하고 Visual Studio를 설치한 후 MFC 응용 프로그램 마법사를 사용하여 MFC 프로그램을 작성하는 방법을 학습한다.
Visual C++ Programming Document/View Architecture 3
제 1 장 영상처리 기초.
MFC를 이용한 네트워크게임 졸업 프로젝트 담당 교수 : 김재형 교수님 김 성준 김 민기.
MFC 발전 과정과 주요 특징을 개괄적으로 이해한다.
Department of Digital Contents Sang Il Park
윤 홍 란 MFC 기초 윤 홍 란
Windows Programming 시작하기
태양계 시뮬레이션 팀 명: 복학생 강유진 박지혜.
스레드의 개념과 동작 원리를 이해한다. MFC 스레드의 두 종류인 작업자 스레드와 UI 스레드 사용법을 익힌다.
범용 소켓 클래스 만들기.
졸업작품발표 타자 연습 프로그램 By.. Eunju 담당 교수 : 이형원 교수님 학번 : 이름 : 김은주.
Department of Digital Contents Sang Il Park
Network Socket Programming
Microsoft Visual C++ 제 1편 입문편 5장. 샘플 프로그램의 사용자화
CH 1. MFC 전체보기 정보통신공학과 안 재 형.
MFC Application Frameworks (AFX)
MFC 프로그래밍에 관한 팁 / Keyboard / Timer
Visual C++ Programming Output and File
Visual C++ Programming Common Controls
03장 영상처리를 위한 Visual C++ 디지털 영상 파일 포맷
프로그래밍2 및 실습 C언어 기반의 C++ 2.
Visual C++ Programming MFC Programming의 이해
분할 윈도, 다중 뷰… 영상 통신 연구실 권 동 진 발표 일 : 04월 27일.
Windows Programming 시작하기
날짜: 팀명: TEAM-SIX 발표자: 이기영
제 3 장 영역 기반 처리.
MFC Internals.
Lab 4 보고서 교재 5장 사용자 인터페이스 예제 - 사용자 인터페이스 갱신
시스템 접속환경 설정 인터넷 옵션 설정 익스플로러 상단 메뉴 에서 을 클릭하고, 아래 순서대로 설정합니다. 1. 탭에서 을 클릭하여 “페이지 열 때마다”를 체크하고 합니다. 2. 탭을 선택하고 하단의 에.
Lab 1 Guide: 교재 2장 DrawX ( 쪽)
ODBC &DAO 안명상.
Lab 9 Guide: 인터넷 프로그래밍 예제 * 일대일 채팅 프로그램 (교재 27장, 쪽)
“디지털 미디어의 이해” 실내건축 박선영.
Windows 프로그래밍 환경 및 MFC의 구조
가장 많이 사용 Accelerator 최상위 WM_COMMAND, OLE 메시지 관련 이벤트 처리만 가능 이 클래스를 상속받아서 다른 이벤트 처리 이벤트 처리 관련 윈도우(창) 최상위 클래스 멀티 테스킹(모듈) CFrameWnd, Cview,
CONTENTS Ⅰ. 대회목적 Ⅱ. 대회개요 Ⅲ. 대회요강 Ⅳ. 대회규정 Ⅴ. 운영계획 Ⅵ. 홍보계획 Ⅶ. 예산계획.
04장 ㅎㅎ 화소점 처리 화소 점 처리의 개념 디지털 영상의 산술연산과 논리연산 디지털 영상의 다양한 화소 점 처리 기법
6월 1주 주간메뉴표 NEW 엄마손 조식 쉐프 삼촌 중식 참새 방앗간 석식 ◎원산지 안내 : 쌀(국내산)
컴퓨터 계측 및 실습 C++ 기초 영남대학교 기계공학부.
컨트롤, 프로퍼티, 이벤트.
경영학의 상황학파에 대해서… 경제학과 3학년 최준용 회계학과 4학년 진현빈
1 2 4 &
MFC 응용 프로그램 구조 두 개의 윈도우로 구성된 일반적인 MFC 프로그램 프레임 윈도우
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 02. C언어 기반의 C++ 2.
2009개정 중등 국어과 교육과정.
MFC 기초 윈도우 응용프로그램 개발 간략한 역사 Microsoft Foundation Classes
Presentation transcript:

Visual C++ Programming Document/View Architecture Department of Digital Contents Sang Il Park

도큐먼트/뷰 구조 (1/6) 도큐먼트와 뷰 클래스의 역할 클래스 역할 도큐먼트 데이터를 저장하거나 읽어들인다. 데이터의 변경 사항이 생기면 뷰의 화면을 갱신한다. 뷰 데이터를 화면에 표시한다. 사용자와의 상호 작용을 담당한다.

도큐먼트/뷰 구조 (2/6) 도큐먼트/뷰 구조의 장점 서로 다른 기능을 도큐먼트와 뷰 클래스로 분리해서 구현하기 때문에 개념적으로 이해하기 쉽다. 하나의 도큐먼트에 여러 개의 뷰가 존재하는 모델을 구현하기가 쉽다. 예) 비주얼 C++ 편집창 MFC에서 도큐먼트/뷰 구조를 위해 제공하는 부가적인 서비스를 이용할 수 있다. 예) 직렬화

도큐먼트/뷰 구조 (3/6) SDI와 MDI 다룰 수 있는 문서의 개수에 따라 구분

도큐먼트/뷰 구조 (4/6) 도큐먼트 템플릿 MFC 클래스 계층도 도큐먼트, 프레임 윈도우, 뷰 클래스 정보를 유지 필요에 따라 해당 객체를 동적으로 생성 MFC 클래스 계층도 SDI MDI

도큐먼트/뷰 구조 (5/6) InitInstance() 함수 BOOL CExFileApp::InitInstance() { ... CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CExFileDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CExFileView)); AddDocTemplate(pDocTemplate); }

도큐먼트/뷰 구조 (6/6) 주요 객체의 관계 생성 주체 생성되는 것 ①응용 프로그램 객체 ②도큐먼트 템플릿 객체 ③도큐먼트 객체, ④프레임 윈도우 객체 프레임 윈도우 객체 ⑤뷰 객체

도큐먼트/뷰 구조 응용 프로그램 예제 작성 (1/5) 도큐먼트/뷰 구조 응용 프로그램 예제 작성 (1/5) 프로젝트 생성 (단일문서 + 문서/뷰 아키텍쳐)

도큐먼트/뷰 구조 응용 프로그램 예제 작성 (2/5) 도큐먼트/뷰 구조 응용 프로그램 예제 작성 (2/5) 고급기능 옵션 설정 ActiveX controls 선택 해제

도큐먼트/뷰 구조 응용 프로그램 예제 작성 (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); }

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

도큐먼트/뷰 구조 응용 프로그램 예제 작성 (5/5) 도큐먼트/뷰 구조 응용 프로그램 예제 작성 (5/5) 실행 결과 (cont'd)

(CSingleDocTemplate) SDI 응용 프로그램 구조 (1/11) SDI 응용 프로그램 구조 1 응용 프로그램 (CWinApp) 프레임 윈도우 (CFrameWnd) 도큐먼트 템플릿 (CSingleDocTemplate) 도큐먼트 (CDocument) 뷰 (CView)

(CSingleDocTemplate) SDI 응용 프로그램 구조 (2/11) SDI 응용 프로그램 구조 2 응용 프로그램 (CWinApp) 도큐먼트 템플릿 (CSingleDocTemplate) 도큐먼트 (CDocument) 뷰 (CView) 프레임 윈도우 (CFrameWnd)

SDI 응용 프로그램 구조 (3/11) 도큐먼트 프레임 윈도우 도큐먼트의 내용을 화면에 표시하는 역할을 하는 뷰를 자식으로 갖는 윈도우 = 뷰의 부모 윈도우 = 뷰를 감싸고 있는 윈도우 메인 윈도우 메인 윈도우 = 도큐먼트 프레임 윈도우 도큐먼트 프레임 윈도우

GetFirstViewPosition GetFirstDocTemplatePosition SDI 응용 프로그램 구조 (4/11) 주요 객체 사이의 참조 도큐먼트 뷰 프레임 윈도우 GetFirstViewPosition & GetNextView GetDocument GetActiveDocument GetActiveView 응용 프로그램 AfxGetMainWnd AfxGetApp m_pMainWnd GetParentFrame 템플릿 GetFirstDocTemplatePosition & GetNextDocTemplate GetDocTemplate GetFirstDocPosition & GetNextDoc

SDI 응용 프로그램 구조 (5/11) 함수 요약 CWinApp* AfxGetApp ( ); 응용 프로그램 객체의 주소를 리턴 CWnd* AfxGetMainWnd ( ); 메인 윈도우 객체의 주소를 리턴 CFrameWnd* CWnd::GetParentFrame ( ); 프레임 윈도우 객체의 주소를 리턴 CView* CFrameWnd::GetActiveView ( ); 활성 뷰 객체의 주소를 리턴

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

SDI 응용 프로그램 구조 (7/11) 함수 요약 (cont'd) POSITION CWinApp::GetFirstDocTemplatePosition ( ); CDocTemplate* CWinApp::GetNextDocTemplate (POSITION& pos); 응용 프로그램 객체가 관리하는 모든 도큐먼트 템플릿 객체의 주소를 리턴 응용 프로그램 객체 m_templateList 도큐먼트 템플릿 객체#1 객체#2 객체#3 NULL

SDI 응용 프로그램 구조 (8/11) 함수 요약 (cont'd) POSITION CDocTemplate::GetFirstDocPosition ( ); CDocument* CDocTemplate::GetNextDoc (POSITION& rPos); 도큐먼트 템플릿 객체가 관리하는 모든 도큐먼트 객체의 주소를 리턴 CDocTemplate* CDocument::GetDocTemplate ( ); 도큐먼트 객체와 연결된 도큐먼트 템플릿 객체의 주소를 리턴 도큐먼트 템플릿 객체 m_docList 도큐먼트 객체#1 객체#2 객체#3 NULL

문서/뷰 구조 좀 더 자세히 보기 단일 문서를 다시 만든다. 문서 템플릿 문자열을 편집

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

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

SDI 응용 프로그램 구조 (11/11) 도큐먼트 문자열 ExSDI\n\nExSDI\nExSDI 파일 (*.sdi)\n.sdi\nExSDI.Document ① ② ③ ④ ⑤ ⑥ \nExSDI Document ⑦

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

도큐먼트 클래스 (2/3) 주요 함수 (cont'd) virtual BOOL OnNewDocument ( ); 새 문서를 생성할 때 자동으로 호출 virtual BOOL OnOpenDocument (LPCTSTR lpszPathName); 파일을 열 때 자동으로 호출 virtual void DeleteContents ( ); 새로운 문서를 생성하거나 파일을 열 때 자동으로 호출 virtual void Serialize (CArchive& ar); 파일을 열거나 저장할 때 자동으로 호출

도큐먼트 클래스 (3/3) 가상 함수 호출 순서 [파일]->[새 파일] 메뉴 항목을 선택할 때 [파일]->[열기...] 메뉴 항목을 선택할 때 [파일]->[저장] 또는 [파일]->[다른 이름으로 저장...] 메뉴 항목을 선택할 때 DeleteContents()  OnNewDocument() DeleteContents()  Serialize()  OnOpenDocument() Serialize()

뷰 클래스 주요 함수 virtual void OnDraw (CDC* pDC); 화면 출력, 인쇄, 인쇄 미리보기를 할 때 자동으로 호출 virtual void OnInitialUpdate(); 뷰 객체가 도큐먼트 객체와 연결된 후 화면에 보이기 전에 자동으로 호출 virtual void OnUpdate (CView* pSender, LPARAM lHint, CObject* pHint); CDocument::UpdateAllViews() 함수와 CView::OnInitialUpdate() 함수에서 호출

코딩연습 Document/View 구조를 사용하여 원을 그리고, 저장/로드 하는 프로그램을 만들자. 고쳐야 하는 부분 CView:: OnDraw() CDocument:: OnNewDocument() Serialize()

명령 라우팅 (1/2) MFC 응용 프로그램에서 사용하는 메시지 종류

명령 라우팅 (2/2) 명령 라우팅 순서 ⑥ ::DefWindowProc() ⑤ 응용 프로그램 객체 명령 메시지 ④ 프레임 윈도우 명령 메시지 명령 갱신 메시지 ② 활성 도큐먼트 ① 활성 뷰 ③ 도큐먼트 템플릿 ⑤ 응용 프로그램 객체 ⑥ ::DefWindowProc()

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

분할 윈도우 (2/4) 동적 분할 윈도우 구현

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

분할 윈도우 (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; }

MDI 응용 프로그램 구조 (1/8) MDI 응용 프로그램 기본 구조 응용 프로그램 (CWinApp) 도큐먼트 템플릿 (CMultiDocTemplate) 도큐먼트 (CDocument) 뷰 (CView) 도큐먼트 프레임 윈도우 (CMDIChildWnd) 메인 윈도우 (CMDIFrameWnd)

MDI 응용 프로그램 구조 (2/8) MDI 응용 프로그램 일반 구조 1 응용 프로그램 객체 도큐먼트 템플릿 도큐먼트 객체 2 뷰 객체 2 도큐먼트 객체 1 뷰 객체 1 도큐먼트 객체 3 뷰 객체 3

MDI 응용 프로그램 구조 (3/8) SDI와 MDI 응용 프로그램 비교 도큐먼트 템플릿으로 CSingleDocTemplate 클래스 대신 CMultiDocTemplate 클래스 사용 SDI 응용 프로그램과 달리 MDI 응용 프로그램은 도큐먼트 객체를 재사용하지 않고 매번 새로 생성 MDI 응용 프로그램에서는 메인 윈도우와 도큐먼트 프레임 윈도우가 별개이며 각각 CMDIFrameWnd, CMDIChildWnd 클래스 사용

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

MDI 응용 프로그램 구조 (5/8) 주요 객체 사이의 참조 AfxGetMainWnd AfxGetApp GetFirstViewPosition & GetNextView GetDocument GetActiveDocument GetActiveView GetParentFrame 도큐먼트 프레임 윈도우 응용 프로그램 메인 윈도우 뷰 템플릿 GetFirstDocTemplatePosition & GetNextDocTemplate GetDocTemplate m_pMainWnd GetFirstDocPosition & GetNextDoc MDIGetActive 또는 GetActiveFrame

MDI 응용 프로그램 구조 (6/8) 함수 요약 CMDIChildWnd* CMDIFrameWnd::MDIGetActive (BOOL* pbMaximized = NULL); CFrameWnd* CFrameWnd::GetActiveFrame ( ); 활성 도큐먼트 프레임 윈도우 객체의 주소를 리턴

MDI 응용 프로그램 구조 (7/8) MDI 응용 프로그램 특징 [파일]->[새 파일] 메뉴 항목을 선택하면 새로운 도큐먼트, 도큐먼트 프레임 윈도우, 뷰 객체가 생성 [창]->[다음 창] 메뉴 항목을 선택하면 활성 도큐먼트에 대한 뷰를 추가로 생성 가능 최소 두 개의 메뉴 사용

MDI 응용 프로그램 구조 (8/8) MDI 응용 프로그램 일반 구조 2 응용 프로그램 객체 도큐먼트 템플릿 도큐먼트 객체 2 뷰 객체 2 도큐먼트 객체 1 뷰 객체 1 도큐먼트 객체 3 뷰 객체 3 뷰 객체 4

다양한 도큐먼트 타입 지원 (1/2) MDI 응용 프로그램 일반 구조 3 두 개 이상의 도큐먼트 타입 지원 응용 프로그램 객체 도큐먼트 템플릿 1 도큐먼트 객체 2 뷰 객체 2 도큐먼트 객체 1 뷰 객체 1 도큐먼트 객체 3 뷰 객체 3 도큐먼트 템플릿 2 도큐먼트 객체 4 뷰 객체 4 뷰 객체 5

다양한 도큐먼트 타입 지원 (2/2) 새로운 도큐먼트 타입 추가 ① 새로운 도큐먼트와 뷰 클래스를 생성하고 구현 코드 작성 ① 새로운 도큐먼트와 뷰 클래스를 생성하고 구현 코드 작성 ② 아이콘, 메뉴, 도큐먼트 문자열 등 리소스를 추가 ③ InitInstance() 함수 수정