컴퓨터 공부/MFC 프로그래밍

[5월 25일 1교시] Document 읽고 쓰기 2

려리군 2009. 5. 25. 10:09


 사용된 매크로CObject::IsKindOf  CRuntimeClass::CreateObjectCArchive::operator>>
CArchive::operator<< 
기본 CObject    
DECLARE_DYNAMIC 가능   
DECLARE_DYNCREATE가능 가능  
DECLARE_SERIAL 가능 가능 가능 


Document : 프로그램이 만들어 내는 데이터. 디스크 파일로 저장 가능.

Document Type : 프로그램 별로 달라지는 데이터 유형.

Document Template : Document Type마다 달라지는 Document - View - Frame Window와의 관계



Document Template

Document Template 요소

Frame, View, Document, 리소스ID


SDI : 프로그램 시작시 동적으로 한번만 객체 생성.

MDI 

Document Type을 여러개 만들 수 있다. Template은 어떤 객체가 동적으로 생성되어야 하는 지에 대한 정보를 갖는다.

리소스 ID : 메뉴, 아이콘, 단축키 테이블(각 Template에 대해 정의해 주어야 한다.) + 툴바 

IDR_MAINFRAME 문자열 의미(368P)

윈도우 타이틀바 문자열 \n 저장시할당되는디폴트이름(생략시 untitled) \n 도큐먼트타입이름 \n 

Document 파일에 관한 필터 \n 파일열기 대화상자에서 사용할 기본 확장자 \n 레지스트리에 등록할 ID 

\n 레지스트리에 등록될 Document타입 이름


응용 프로그램 수행과정

1. OS가 프로그램을 메모리로 load

2. theApp등의 전역 변수 행성.

3. OS가 WinMain호출

4. WinMain은 theApp.InitInstance 호출

5. InitInstance에서는 document를 load하고 main frame과 view window를 그려준다.

6. WinMain은 theApp.Run 호출하여 메세지 처리.


virtual BOOL CWinApp::InitInstance();

참고주소 : http://msdn.microsoft.com/ko-kr/library/ae6yx0z0(VS.80).aspx

윈도우즈 아래서 실행하는 응용 프로그램의 새로운 인스턴스를 초기화하기 위해 InitInstance를 오버라이딩 한다. 일반적으로 윈도우를 가리키는 데이터 멤버 CWinThread::m_pMainWnd를 설정하고 window 객체를 생성하기 위해 이를 오버라이딩 한다. 

리턴 : 성공적인 초기화시 TRUE, 아니면 FALSE

virtual int CWinApp::ExitInstance();

참고주소 : http://msdn.microsoft.com/ko-kr/library/e4zc2h84(VS.80).aspx

응용 프로그램의 현재 인스턴스를 정료하기 위해 Run 멤버 함수 에서 프레임워크에 의해 호출된다.

리턴 : 응용 프로그램의 종료코드. 0은 오류 없음. 0보다 큰 값은 오류를 나타낸다.


MDI to SDI

1. ChildFrm.cpp, ChildFrm.h 프로젝트에서 삭제

2. MainFrm.cpp, MainFrm.h 에서 CMDIFrameWnd를 CFrameWnd로 바꾼다.

3. InitInstance()에서 CMultiDocTemplate를 CSingleDocTemplate로 바꾼다.

그리고 전달인자 중 CChildFrame을 CMainFrame으로 바꾼다.

4. InitInstance()에서 pMainFrame을 CFrameWnd로 바꾸고 다음 부분을 주석처리 한다.

CMainFrame* pMainFrame = new CMainFrame;

if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))

return FALSE;

m_pMainWnd = pMainFrame;


5. MainFrm.h의 DECLARE_DYNAMIC(CMainFrame)을 DECLARE_DYNCREATE(CMainFrame)로

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)를 IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)로 바꾼다.