Microsoft PowerPoint - hci2-lecture10.ppt

Similar documents
슬라이드 1

Microsoft PowerPoint - hci2-lecture7.ppt

윈도우 프로그래밍의 개념

<4D F736F F F696E74202D20C1A C0E520B5B5C5A5B8D5C6AE20C6C4C0CF20C0D4C3E2B7C220B9D720B4D9BEE7C7D120BAE420C5ACB7A1BDBA2E BC8A3C8AF20B8F0B5E55D>

Visual C++의 개요

untitled

5장 MFC기반 다지기

Microsoft Word - hci07-final-answer.doc

Microsoft Word - hci08-final-answer.doc

Programming hwp

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint _파일입출력.ppt

Microsoft PowerPoint - CPP_chap3

Microsoft PowerPoint - hci2-lecture3.ppt

4S 1차년도 평가 발표자료

MFC 프로그래밍

Microsoft PowerPoint - hci2-lecture3.ppt

윈도우시스템프로그래밍

<4D F736F F F696E74202D203039C0E520B4EBC8ADBBF3C0DA205BC8A3C8AF20B8F0B5E55D>

Programming hwp

<4D F736F F F696E74202D203036C0E520BBE7BFEBC0DA20C0CEC5CDC6E4C0CCBDBA205BC8A3C8AF20B8F0B5E55D>

Chapter 1. MFC 시작하기

WISHBONE System-on-Chip Interconnection Architecture for Portable IP Cores

Microsoft PowerPoint - MFC-교재.ppt

Microsoft PowerPoint - CPP_chap7_dialogbox(2)

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

그래픽 프로그래밍

Microsoft PowerPoint - hci2-lecture5-messagemap.ppt

윈도우시스템프로그래밍

Microsoft PowerPoint - hci2-lecture6.ppt

Microsoft PowerPoint - hci2-lecture6.ppt

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

C++ Programming

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

[제1강] 텍스트를 입력하세요

슬라이드 1

윈도우시스템프로그래밍

Microsoft PowerPoint - hci2-lecture1.ppt

<B0EDB1DEC7C1B7CEB1D7B7A1B9D6284D DBFE4BEE0C1A4B8AE28B9DAB1E2C8AB292E687770>

Microsoft PowerPoint - hci2-lecture1.ppt

어댑터뷰

PowerPoint Presentation

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

08장 윈도우에서의 그리기

설계란 무엇인가?

Microsoft PowerPoint - hci2-lecture9.ppt

C++ Programming

<4D F736F F F696E74202D203032C0E520C0AFC6BFB8AEC6BC20C5ACB7A1BDBABFCD20C1FDC7D520C5ACB7A1BDBA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - Chapter 6.ppt

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

JAVA PROGRAMMING 실습 08.다형성

<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

쉽게 풀어쓴 C 프로그래밍

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

제8장 자바 GUI 프로그래밍 II

C++ Programming

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint Template

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

슬라이드 1

Microsoft PowerPoint - additional06.ppt [호환 모드]

Microsoft PowerPoint _대화상자.ppt

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

歯Lecture2.PDF

PowerPoint Presentation

Programming hwp

PowerPoint Presentation

Microsoft PowerPoint - C++ 5 .pptx

10 장세균전프로그래밍 10.1 게임룰 (1) 사람과컴퓨터가싸우는 2인용보드게임이다. (2) 사람이먼저움직이고, 컴퓨터가움직인다. (3) 세균을가로및세로방향으로 2칸까지빈칸으로이동시킬수있다. (4) 1칸을이동할경우에는복제가된다. (5) 이동한후주변세균은내편으로바뀐다.

Microsoft PowerPoint - Chap12-OOP.ppt

04장 메시지 처리 유형

윈도우시스템프로그래밍

<33372DC0A9B5B5BFECC7C1B7CEB1D7B7A1B9D62E687770>

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

1장 윈도우 프로그래밍 들어가기

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - CSharp-10-예외처리

JUNIT 실습및발표

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

슬라이드 1

Spring Boot/JDBC JdbcTemplate/CRUD 예제

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

PowerPoint 프레젠테이션

17장 클래스와 메소드

KNK_C_05_Pointers_Arrays_structures_summary_v02

슬라이드 1

gnu-lee-oop-kor-lec06-3-chap7

PowerPoint 프레젠테이션

Microsoft PowerPoint - CPP_chap6_interface(2)

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

Programming hwp

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

API 매뉴얼

Transcription:

Overview 도큐먼트 / 뷰구조 HCI Programming 2 (321190) 2008 년가을학기 11/25/2008 박경신 도큐먼트 / 뷰구조 도큐먼트템플렛 (Document Template) SDI (Single Document Interface) 응용프로그램의기본구조 MDI (Multiple Document Interface) 응용프로그램의기본구조 명령라우팅의개념 여러개의뷰또는여러개의도큐먼트타입을생성및활용 2 도큐먼트 / 뷰구조 파일도큐먼트객체뷰객체사용자 도큐먼트 / 뷰구조 SDI (Single-Document Interface) 하나의응용프로그램에서어느한순간에하나의문서만을대상으로작업할수있는사용자인터페이스 MDI (Multiple- Document Interface) 하나의응용프로그램에서동시에두개이상의문서를대상으로작업할수있는사용자인터페이스 Class Document View 역할 데이터를저장하거나읽기데이터의변경사항이생기면뷰의화면을갱신 데이터를화면에표시사용자와의상호작용 3 4

SDI (Single Document Interface) MDI (Multiple Document Interface) CSingleDocTemplate CMultiDocTemplate 5 6 Document Template 주요객체의생성관계 도큐먼트, 프레임윈도우, 뷰클래스정보를유지하는클래스 응용프로그램클래스의 InitInstance() 에서생성 MFC 클래스계층도 BOOL CExSDIApp::InitInstance()... CSingleDocTemplate* pdoctemplate; pdoctemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CExSDIDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CExSDIView)); AddDocTemplate(pDocTemplate);... 7 생성주체 생성되는것 1응용프로그램객체 2도큐먼트템플릿객체 도큐먼트템플릿객체 3도큐먼트객체, 4프레임윈도우객체 프레임윈도우객체 5뷰객체 4 1 2 3 5 8

//(1) 응용프로그램클래스 (CWinApp 파생 ) class CExSDIApp : public CWinApp BEGIN_MESSAGE_MAP(CExSDIApp, CWinApp) // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) END_MESSAGE_MAP() BOOL CExSDIApp::InitInstance() CSingleDocTemplate* pdoctemplate; pdoctemplate = new CSingleDocTemplate( // 도큐먼트탬플릿객체생성 IDR_MAINFRAME, // 리소스 ID RUNTIME_CLASS(CExSDIDoc), //Document RUNTIME_CLASS(CMainFrame), //main SDI frame window RUNTIME_CLASS(CExSDIView)); //View AddDocTemplate(pDocTemplate); // 응용프로그램객체에탬플릿객체추가 // command line 을분석및처리 // 생성된메인프레임윈도우를화면에보이기 m_pmainwnd->showwindow(sw_show); m_pmainwnd->updatewindow(); //WM_PAINT 메시지보내기 return TRUE; 9 //(2) 프레임윈도우클래스 (CFrameWnd 파생 ) // 동적객체생성기능을사용하기위한매크로 //MainFrm.h class CMainFrame : public CFrameWnd protected: DECLARE_DYNCREATE(CMainFrame)// 동적객체생성을위한매크로선언부 //MainFrm.cpp IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) // 동적객체생성을위한매크로구현부 10 //(3) 뷰클래스 (CView 파생 ) //ExSDIView.h class CExSDIView : public CView protected: DECLARE_DYNCREATE(CExSDIView) public: virtual void OnDraw(CDC* pdc); //ExSDIView.cpp IMPLEMENT_DYNCREATE(CExSDIView, CView) void CExSDIView::OnDraw(CDC* pdc) CExSDIDoc* pdoc = GetDocument(); // 도큐먼트객체얻어오기 CString str = pdoc->m_docstr; // 도큐먼트의멤버변수접근 CFont newfont, *poldfont=null; newfont.createpointfont(200, "Arial"); poldfont =pdc->selectobject(&newfont); pdc->textout(100, 100, "SDI Test Program - View"); //view의문자열출력 pdc->textout(100, 140, str); //document의문자열출력 11 //(3) 도큐먼트클래스 (CDocument 파생 ) //ExSDIDoc.h class CExSDIDoc : public CDocument protected: DECLARE_DYNCREATE(CExSDIDoc) public: virtual BOOL OnNewDocument(); //[ 새파일 ] 선택시호출되는가상함수 virtual void Serialize(CArchive& ar); // 파일을읽거나저장하기위한함수 CString m_docstr; // 멤버변수 //ExSDIDoc.cpp IMPLEMENT_DYNCREATE(CExSDIDoc, CDocument) BOOL CExSDIDoc::OnNewDocument() // 새파일선택시초기화코드포함 if (!CDocument::OnNewDocument()) return FALSE; return TRUE; m_docstr="sdi Test Program - DOC"; // 멤버변수초기화 void CExSDIDoc::Serialize(CArchive& ar) if (ar.isstoring()) ar << m_docstr;// 파일에저장하기위한코드 else ar >> m_docstr; // 파일로부터읽기위한코드 12

SDI 응용프로그램구조 SDI 응용프로그램기본구조 SDI 응용프로그램구조 SDI 응용프로그램구조 분할윈도우사용시 응용프로그램 (CWinApp) 도큐먼트템플릿 (CSingleDocTemplate) 프레임윈도우 (CFrameWnd) 도큐먼트 (CDocument) 뷰 (CView) 응용프로그램 (CWinApp) 도큐먼트템플릿 (CSingleDocTemplate) 프레임윈도우 (CFrameWnd) 도큐먼트 (CDocument) 뷰 (CView) 뷰 (CView) 하나의도큐먼트만존재 - 새로운문서를생성하거나저장된문서를열땐기존의도큐먼트객체를재사용함 13 반면, 뷰객체는응용프로그램의필요에따라여러개생성가능함 14 도큐먼트프레임윈도우 SDI 응용프로그램에서주요객체사이의참조 도큐먼트프레임윈도우 (Document Frame Window) 도큐먼트의내용을화면에표시하는역할을하는뷰를자식으로갖는윈도우 뷰의부모윈도우또는뷰를감싸고있는윈도우 도큐먼트 GetFirstViewPosition & GetNextView GetDocument 뷰 GetActiveDocument GetActiveView GetParentFrame 메인윈도우 = 도큐먼트프레임윈도우 메인윈도우 도큐먼트프레임윈도우 GetDocTemplate GetFirstDocPosition & GetNextDoc 도큐먼트템플릿 도큐먼트프레임윈도우 m_pmainwnd 응용프로그램 AfxGetMainWnd AfxGetApp SDI 응용프로그램 MDI 응용프로그램 15 GetFirstDocTemplatePosition & GetNextDocTemplate 16

주요객체사이의참조함수 CWinApp* AfxGetApp ( ); 응용프로그램객체의주소를리턴하는전역함수 CMyApp *pmyapp = (CMyApp *) AfxGetApp(); CWnd* AfxGetMainWnd ( ); 메인윈도우객체의주소를리턴하는전역함수 CMainFrame *pmainframe = (CMainFrame *) AfxGetMainWnd(); CFrameWnd* CWnd::GetParentFrame ( ); 부모윈도우중프레임윈도우객체의주소를리턴 일반적으로도큐먼트프레임윈도우가이에해당 CView* CFrameWnd::GetActiveView ( ); 활성뷰 (Active View) 객체의주소를리턴 17 주요객체사이의참조함수 CDocument* CFrameWnd::GetActiveDocument ( ); 활성도큐먼트 (Active Document) 객체의주소를리턴 CDocument* CView::GetDocument ( ); 뷰객체와연결된도큐먼트객체의주소를리턴 POSITION CDocument::GetFirstViewPosition ( ); CView* CDocument::GetNextView (POSITION& rposition); 도큐먼트객체는자신과연결된뷰를연결리스트로관리 도큐먼트객체와연결된모든뷰객체의주소를리턴 도큐먼트객체 m_viewlist 뷰객체 #1 뷰객체 #2 뷰객체 #3 18 NULL 주요객체사이의참조함수 주요객체사이의참조함수 POSITION CWinApp::GetFirstDocTemplatePosition ( ); CDocTemplate* CWinApp::GetNextDocTemplate (POSITION& pos); 응용프로그램객체가관리하는모든도큐먼트템플릿객체의주소를리턴 도큐먼트템플릿객체 #1 도큐먼트템플릿객체 #2 도큐먼트템플릿객체 #3 POSITION CDocTemplate::GetFirstDocPosition ( ); CDocument* CDocTemplate::GetNextDoc (POSITION& rpos); MDI 응용프로그램은여러개의도큐먼트객체를생성하며연결리스트로관리 도큐먼트템플릿객체가관리하는모든도큐먼트객체의주소를리턴 도큐먼트템플릿객체 m_doclist 도큐먼트객체 #1 도큐먼트객체 #2 도큐먼트객체 #3 NULL 응용프로그램객체 m_templatelist NULL CDocTemplate* CDocument::GetDocTemplate ( ); 도큐먼트객체와연결된도큐먼트템플릿객체의주소를리턴 19 20

SDI 응용프로그램예제작성 프로젝트생성 1~6 단계옵션설정 단계 변경사항 1 'Single document' 를선택한다. 2 Compound Document Support 변경사항없음 Document Template Strings 파일확장자 sdi 를입력 3 DB 변경사항없음 4 UI 변경사항없음 5 Advanced Features 'ActiveX Controls' 선택을해제 6 Generated Classes 변경사항없음 21 SDI 응용프로그램예제작성 InitInstance() 함수 BOOL CExSDIApp::InitInstance()... // 응용프로그램의설정정보가저장될레지스트리위치를지정 1 SetRegistryKey(_T("Local AppWizard-Generated Applications")); // 가장최근에사용한파일목록을레지스트리에서로드 2 LoadStdProfileSettings(); CSingleDocTemplate* pdoctemplate; pdoctemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CExSDIDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CExSDIView)); AddDocTemplate(pDocTemplate); 22 SDI 응용프로그램예제작성 InitInstance() 함수 3 EnableShellOpen(); // 마우스로더블클릭해서파일을열수있게함 4 RegisterShellFileTypes(TRUE); // 도큐먼트템플릿을검사해서찾아낸 // 도큐먼트타입을레지스트리에등록 CCommandLineInfo cmdinfo; ParseCommandLine(cmdInfo); if (!ProcessShellCommand(cmdInfo)) return FALSE; m_pmainwnd->showwindow(sw_show); m_pmainwnd->updatewindow(); 도큐먼트문자열 (Document String) 도큐먼트문자열 (Document String) 을위한리소스 CDocTemplate::GetDocString() 으로접근 5 m_pmainwnd->dragacceptfiles(); // 마우스로파일을 Drag-and-Drop // 하면해당파일을열도록함 return TRUE; 23 24

도큐먼트문자열 (Document String) 도큐먼트문자열 (Document String) ExSDI\n\nExSDI\nExSDI 파일 (*.sdi)\n.sdi\nexsdi.document 1 2 3 4 5 6 \nexsdi Document 7 번호의미 1 프레임윈도우의타이틀바에표시되는제목 2 새로생성한문서의제목. 생략하면기본값인 제목없음 으로설정 3 두개이상의도큐먼트타입을지원하는 MDI 응용프로그램에서만사용. 새로운문서를생성할때도큐먼트타입을묻는대화상자가뜨는데이대화상자에표시되는문자열 4 열기또는저장하기대화상자에표시 5 파일의기본확장자로사용 6 레지스트리에등록되는도큐먼트타입 ID. 공백을허용하지않음 // GetDocString( ) 사용예 CExSDIApp *papp = (CExSDIApp *)AfxGetApp(); POSITION pt = papp->getfirstdoctemplateposition(); CDocTemplate* pdoct = papp->getnextdoctemplate(pt); CString title, docname, filenewname,filtername, filterext; pdoct->getdocstring(title, CDocTemplate::windowTitle); pdoct->getdocstring(docname, CDocTemplate::docName); pdoct->getdocstring(filenewname, CDocTemplate::fileNewName); pdoct->getdocstring(filtername, CDocTemplate::filterName); pdoct->getdocstring(filterext, CDocTemplate::filterExt); 7 레지스트리에등록되는도큐먼트타입문자열. 공백을25 허용 26 도큐먼트클래스주요함수 void SetModifiedFlag (BOOL bmodified = TRUE); 도큐먼트객체가유지하는데이터를수정한경우호출 파일을저장하지않고다른파일을열거나종료시확인에이용 void UpdateAllViews (CView* psender, LPARAM lhint = 0L, CObject* phint = NULL); 도큐먼트객체와연결된모든뷰의화면을갱신 CDocument::UpdateAllViews() CView::OnUpdate() CWnd::Invalidate() CWnd::OnPaint() CView::OnDraw() 도큐먼트객체 뷰객체 UpdateAllViews(NULL); // 모든뷰의전체영역갱신 UpdateAllViews(this); // 현재뷰를제외한모든뷰의전체영역갱신 UpdateAllViews(NULL, 1, (CObject *) prect) // 모든뷰의사각형 27 영역만갱신 도큐먼트클래스주요함수 void CDocument::UpdateAllViews(CView* psender, LPARAM lhint, CObject* phint) // 생략 POSITION pos = GetFirstViewPosition(); while (pos!= NULL) CView* pview = GetNextView(pos); if (pview!= psender) // psender는제외 pview->onupdate(psender, lhint, phint); // Invalidate() 호출 WM_PAINT -> OnPaint() -> OnDraw() 28

도큐먼트클래스주요가상함수 virtual BOOL OnNewDocument ( ); 새문서를생성할때자동으로호출 도큐먼트클래스의생성자보다 OnNewDocument 함수에초기화코드를추가하는것이바람직함 virtual BOOL OnOpenDocument (LPCTSTR lpszpathname); 파일을열때자동으로호출, 읽어들인데이터를처리할때재정의 virtual BOOL OnSaveDocument (LPCTSTR lpszpathname); 파일을저장할때자동으로호출, 저장할데이터를처리할때재정의 virtual void DeleteContents ( ); 새로운문서를생성하거나파일을열때자동으로호출 virtual void Serialize (CArchive& ar); 파일을열거나저장할때자동으로호출 29 도큐먼트클래스가상함수호출순서 가상함수호출순서 [ 파일 ]->[ 새파일 ] 메뉴항목을선택할때 OnNewDocument() DeleteContents() [ 파일 ]->[ 열기...] 메뉴항목을선택할때 OnOpenDocument() DeleteContents() Serialize() [ 파일 ]->[ 저장 ] 또는 [ 파일 ]->[ 다른이름으로저장...] 메뉴항목을선택할때 OnSaveDocument() Serialize() 30 뷰클래스주요가상함수 명령라우팅 (Command Routing) virtual void OnDraw (CDC* pdc); 화면출력, 인쇄, 인쇄미리보기를할때자동으로호출 virtual void OnInitialUpdate(); 뷰객체가도큐먼트객체와연결된후화면에보이기전에자동으로호출 CView::OnInitialUpdate() 함수는 CView::OnUpdate() 함수를호출하여뷰의화면전체를무효화 virtual void OnUpdate (CView* psender, LPARAM lhint, CObject* phint); CDocument::UpdateAllViews() 함수와 CView::OnInitialUpdate() 함수에서호출 CWnd::Invalidate() 를이용하여뷰화면전체를무효화 효과적인화면갱신이필요할때재정의 MFC 응용프로그램에서사용하는메시지종류 종류설명메시지맵매크로 윈도우메시지 명령메시지 명령갱신메시지 통지메시지 윈도우생성, 종료, 마우스, 키보드등다양한원인에의해발생 메뉴, 툴바, 가속기등에의해발생 메뉴, 툴바, 상태바등의상태를갱신할필요가있을때발생. MFC 에서만사용하는고유의메시지 컨트롤 ( 자식윈도우 ) 이부모윈도우에게보내는메시지 ON_WM_XXX ON_COMMAND(ID, 함수 ) ON_UPDATE_COMMAND _UI(ID, 함수 ) ON_XXX (ID, 함수 ) 두번째와세번째인자를참조하여뷰의화면일부만무효화 31 32

명령라우팅 (Command Routing) 분할윈도우 (Splitter Window) 명령라우팅순서 6 ::DefWindowProc() 5 응용프로그램객체 동적분할윈도우 (Dynamic Splitter Window) 같은뷰클래스를기반으로여러개의뷰를생성 총네개의구획 (Pane) 생성가능 명령메시지 (WM_COMMAND) 명령갱신메시지 (UPDATE_COMMAND_UI) 4 프레임윈도우 3 도큐먼트템플릿 2 활성도큐먼트 1 활성뷰 33 34 동적분할윈도우구현예제작성 프로젝트생성 1~6 단계옵션설정 동적분할윈도우구현예제작성 동적분할윈도우구현 단계 변경사항 1 'Single document' 를선택한다. 2 Compound Document Support 변경사항없음 Document Template Strings 파일확장자를입력 3 DB 변경사항없음 4 UI 에서 Split Window 를체크 5 Advanced Features 'ActiveX Controls' 선택을해제 6 Generated Classes 변경사항없음 35 36

// 동적분할윈도우지원을위해생성된코드 class CMainFrame : public CFrameWnd // Attributes protected: CSplitterWnd m_wndsplitter; // 동적분할윈도우지원을위한클래스추가 // 동적분할윈도우지원을위해생성된코드 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pcontext) return m_wndsplitter.create( this, // 부모윈도우 2, 2, // 가로, 세로분할개수 CSize(10, 10), // 구획 (pane) 의기본크기 // 이크기보다작으면분할을없앰 pcontext); //MFC 윈도우생성에필요한구조체 37 // Document 파일에 m_str 을분할된윈도우에출력하는프로그램 // (WM_CHAR 메시지처리에의하여입력된문자를 m_str 에추가 ) //(1)Document class class CSplitterWinDoc : public CDocument public: CString m_str; // 변수선언 BOOL CSplitterWinDoc::OnNewDocument() if (!CDocument::OnNewDocument()) return FALSE; m_str = ""; // 변수초기화 return TRUE; 38 //(2)View Class void CSplitterWinView::OnDraw(CDC* pdc) CSplitterWinDoc* pdoc = GetDocument(); CRect rect; GetClientRect(&rect); // Document 객체의 m_str 출력 pdc->drawtext(pdoc->m_str, &rect, DT_LEFT); 동적분할윈도우구현예제작성 실행결과 void CSplitterWinView::OnChar(UINT nchar, UINT nrepcnt, UINT nflags) CSplitterWinDoc* pdoc = GetDocument(); pdoc->m_str += (char) nchar; // 입력된문자를 m_str 에추가 // Document 와연결된모든 View 에대한화면갱신 pdoc->updateallviews(null); CView::OnChar(nChar, nrepcnt, nflags); 39 40

분할윈도우 정적분할윈도우 (Static Splitter Window) 서로다른뷰클래스를기반으로여러개의뷰를생성 총 256개의구획생성가능 분할윈도우 정적분할윈도우구현 CView 를기반으로하는새로운뷰클래스를생성 두개의뷰클래스에대하여서로다른처리내용구현 41 // 두번째분할영역을처리하는뷰클래스에 WM_LBUTTONDOWN 메시지처리 // 추가 ( 사각형출력 ) void CSimpleDrawView::OnLButtonDown(UINT nflags, CPoint point) CClientDC dc(this); dc.selectstockobject(ltgray_brush); dc.rectangle(point.x-20, point.y-20, point.x+20, point.y+20); CView::OnLButtonDown(nFlags, point); 42 분할윈도우 정적분할윈도우구현 프레임윈도우클래스의 OnCreateClient () 함수수정 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pcontext) m_wndsplitter.createstatic(this, 2, 1); // 가로 =2, 세로 =1 분할 m_wndsplitter.createview(0, 0, // row=0, col=0 구획 RUNTIME_CLASS(CSimpleSplitterView), CSize(300, 200), pcontext); m_wndsplitter.createview(1, 0, // row=1, col=0 구획 RUNTIME_CLASS(CSimpleDrawView), CSize(300, 200), pcontext); // row=0, col=0 에위치하는뷰객체의주소를받아서활성뷰로설정 SetActiveView((CView *)m_wndsplitter.getpane(0, 0)); return TRUE; 분할윈도우 정적분할윈도우구현 프레임윈도우클래스 (MainFrm.cpp) 에헤더파일추가 #include SimpleDrawView.h #include SimpleSplitterView.h #include SimpleSplitterDoc.h 뷰클래스의 OnChar 에 Invalidate 를호출 BOOL CSimpleSplitterView::OnChar(UINT nchar, UINT nrepcnt, UINT nflags) CSimpleSplitterDoc* pdoc = GetDocument(); pdoc->m_str += (char) nchar; // 입력된문자를 doc 의 m_str 에추가 Invalidate(); // 이뷰만다시그림 return TRUE; 43 44

정적분할윈도우구현예제작성 실행결과 MDI 응용프로그램구조 MDI 응용프로그램기본구조 메인윈도우 (CMDIFrameWnd) 응용프로그램 (CWinApp) 도큐먼트프레임윈도우 (CMDIChildWnd) 도큐먼트템플릿 (CMultiDocTemplate) 도큐먼트 (CDocument) 뷰 (CView) 45 46 MDI 응용프로그램구조 MDI 응용프로그램일반구조 응용프로그램객체 MDI 응용프로그램구조 MDI 응용프로그램일반구조 응용프로그램객체 도큐먼트템플릿 도큐먼트템플릿 도큐먼트객체 1 도큐먼트객체 2 도큐먼트객체 3 도큐먼트객체 1 도큐먼트객체 2 도큐먼트객체 3 뷰객체 1 뷰객체 2 뷰객체 3 뷰객체 1 뷰객체 2 뷰객체 3 뷰객체 4 47 48

SDI 와 MDI 응용프로그램비교 도큐먼트템플릿으로 CSingleDocTemplate 클래스대신 CMultiDocTemplate 클래스사용 SDI 응용프로그램과달리 MDI 응용프로그램은도큐먼트객체를재사용하지않고매번새로생성 MDI 응용프로그램에서는메인윈도우와도큐먼트프레임윈도우가별개이며각각 CMDIFrameWnd, CMDIChildWnd 클래스사용 MDI 응용프로그램의 InitInstance() InitInstance() 함수 BOOL CSimpleMDIApp::InitInstance()... CMultiDocTemplate* pdoctemplate; pdoctemplate = new CMultiDocTemplate( IDR_SimpleMDITYPE, RUNTIME_CLASS(CSimpleMDIDoc), RUNTIME_CLASS(CChildFrame), // 도큐먼트프레임윈도우 RUNTIME_CLASS(CSimpleMDIView)); AddDocTemplate(pDocTemplate); CMainFrame* pmainframe = new CMainFrame; // 메인윈도우 if (!pmainframe->loadframe(idr_mainframe)) return FALSE; m_pmainwnd = pmainframe;... 49 50 MDI 응용프로그램에서주요객체사이의참조 GetFirstViewPosition & GetNextView 도큐먼트뷰 GetDocument GetActiveDocument GetActiveView GetParentFrame 도큐먼트 GetDocTemplate 프레임윈도우 MDIGetActive or GetActiveFrame 주요객체사이의참조함수 CMDIChildWnd* CMDIFrameWnd::MDIGetActive (BOOL* pbmaximized = NULL); CFrameWnd* CFrameWnd::GetActiveFrame ( ); 활성도큐먼트프레임윈도우객체의주소를리턴 GetFirstDocPosition & GetNextDoc 메인윈도우 m_pmainwnd AfxGetMainWnd 도큐먼트응용프로그램템플릿 GetFirstDocTemplatePosition & GetNextDocTemplate AfxGetApp 51 52

MDI 응용프로그램특징 [ 파일 ]->[ 새파일 ] 메뉴항목을선택하면새로운도큐먼트, 도큐먼트프레임윈도우, 뷰객체가생성 [ 창 ]->[ 다음창 ] 메뉴항목을선택하면활성도큐먼트에대한뷰를추가로생성가능 최소두개의메뉴사용 다양한도큐먼트타입지원 새로운도큐먼트타입추가 1 새로운도큐먼트와뷰클래스를생성하고구현코드작성 2아이콘, 메뉴, 도큐먼트문자열등리소스를추가 3 InitInstance() 함수수정 53 54 다양한도큐먼트타입지원 MDI 응용프로그램일반구조 두개이상의도큐먼트타입지원 MDI 응용프로그램예제작성 프로젝트생성 1~6 단계옵션설정 응용프로그램객체 단계 변경사항 도큐먼트템플릿 1 도큐먼트템플릿 2 1 Multiple document' 를선택한다. 2 Compound Document Support 변경사항없음 3 DB 변경사항없음 4 UI 변경사항없음 도큐먼트객체 1 도큐먼트객체 2 도큐먼트객체 3 도큐먼트객체 4 5 Advanced Features 'ActiveX Controls' 선택을해제함 6 뷰클래스의 Base Class 를 CEditView 로변경 뷰객체 1 뷰객체 2 뷰객체 3 뷰객체 4 뷰객체 5 55 56

MDI 응용프로그램예제작성 메뉴리소스 MDI 응용프로그램예제작성 하나의도큐먼트클래스로여러개의도큐먼트객체생성예 57 58 MDI 응용프로그램예제작성 MDI 응용프로그램예제작성 여러개의도큐먼트클래스를이용한예를추가 1. 새로운도큐먼트와뷰클래스를생성하고구현코드작성 2. 아이콘, 메뉴, 도큐먼트문자열등리소스를추가 59 60

MDI 응용프로그램예제작성 3. 응용프로그램클래스의 InitInstance() 함수수정 BOOL CSimpleMDIApp::InitInstance() // 생략 CMultiDocTemplate* pdoctemplate; pdoctemplate = new CMultiDocTemplate( IDR_SimpleMDITYPE, RUNTIME_CLASS(CSimpleMDIDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CSimpleMDIView)); AddDocTemplate(pDocTemplate); // 추가된토큐먼트, 뷰를위한탬플릿생성및응용프로그램객체에추가 pdoctemplate = new CMultiDocTemplate( IDR_SimpleDRAWTYPE, RUNTIME_CLASS(CSimpleDrawDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CSimpleDrawView)); AddDocTemplate(pDocTemplate); // 생략 61 MDI 응용프로그램예제작성 4. 응용프로그램클래스에헤더파일추가 // SimpleMDI.cpp #include "stdafx.h" #include "SimpleMDI.h" #include "MainFrm.h" #include "ChildFrm.h" #include SimpleMDIDoc.h" #include SimpleMDIView.h" #include SimpleDrawDoc.h" #include SimpleDrawView.h" 62 MDI 응용프로그램예제작성 5. 응용프로그램실행시존재하는도큐먼트타입을선택하여새로만들기 63