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