삽이 부서질 때까지 삽질

[MFC] SDI 간단 분석 본문

MFC

[MFC] SDI 간단 분석

xinfo 2016. 12. 6. 16:15

 응용 프로그램 종류

단일 문서

프로젝트 스타일 : MFC 표준

비주얼 스타일 전환 사용 

문서 템플릿 속성

파일 확장명 : sdi 

사용자 인터페이스 기능

클래식 메뉴 사용

도킹 가능한 클래식 도구 모음 사용

고급 기능 

인쇄 및 인쇄 미리 보기만 체크



vs2013 이상에서는 안해도 되지만 vs2010 이나 vs2012 을 사용하면 CoInitialize 함수를 추가해줘야 문서 파일을 마우스로 클릭해서 프로그램을 실행할 경우 에러가 발생하지 않는다고 한다..


[이 에러 때문에 많은 고생을...]


sdi 확장명으로 저장했다가 키거나 아니면 드래그 앤 드롭을 하여 파일을 열면 저장한 이름으로 열리는 것을 확인할 수 있다.

[제목 없음으로 저장한 뒤 열면 이렇게~]

[이렇게도 뜨기도하고]


이제 SDI 에서 부가적인 기능을 제공하는 코드를 봐보자.


SetRegistryKey(_T("Local AppWizard-Generated Applications"));

이 코드는 해당 위치에 레지스트리가 저장이 된다.

기본 경로는 HKCU\Software\생성된 응용 프로그램\SDITest\Recent FileList 로 저장되어 있다.


EnableShellOpen();

클릭으로 파일을 열 수 있게 하는 함수


RegisterShellFileTypes(TRUE);

도큐먼트 템플릿을 찾아내 도큐먼트 타입을 레지스트리에 등록하는 함수


m_pMainWnd->DragAcceptFiles();

파일을 드래그 앤 드롭하여 파일을 열 수 있게하는 함수


그리고 이 기능들을 정상 작동하기 위해서는 리소스도 필요한데 이 리소스는 문자열 테이블에 IDR_MAINFRAME 리소스에 저장되어 있다. 그리고 CDCocTemplate::GetDocString 함수를 이용해서 접근하면 된다.

그리고 IDR_MAINFRAME 을 보면 \ 로 구분한게 보이는데 이건 서로 다른 의미를 가진 문자열을 구분하여 나열해놓았다.



도큐먼트 클래스

void SetModifiedFlag(BOOL bModified = TRUE)

데이터가 수정된걸 도큐먼트 객체에 알려주려고 사용한다. 그리고 수정되었는데 저장을 하지 않는 상태로 종료되거나 새로운 문서를 호출하면 아래와 같은 메세지 박스가 뜬다.


void UpdateAllViews(CView* pSender, LPARAM IHint = 0L, CObject* pHint = NULL)

도큐먼트 객체가 데이터 수정된 걸 모든 뷰 객체에 전달하여 화면 갱신을 하도록 지시하는 함수이다.


virtual BOOL OnNewDocument()

프로그램이 시작하거나 새 문서를 생성할 때 시작되는 함수이다. 


virtual BOOL OnOpenDocument(LPCTSTR lpszPathName)

메뉴에서 파일 - 열기 를 선택했을 때 자동으로 호출되는 함수이다. 


virtual BOOL DeleteContents()

OnNewDocument, OnOpenDocument 함수 이전에 호출된다. 그 이유는 새로운 파일을 열 거나 도큐먼트 객체를 재사용할 때 기존에 있는 도큐먼트 객체가 삭제되어야 하기 때문에 호출이 된다.


뷰 클래스

virtual void OnDraw(CDC* pDC)

OnPaint와 같이 화면 출력, 인쇄, 인쇄 미리 보기를 할 때 자동으로 호출되는 함수


virtual void OnInitialUpdate()

뷰 객체가 도큐먼트 객체와 연결된 후 화면에 보이기 전 자동으로 호출되는 함수


virtual void OnUpdate(CView* pSender, LPARAM IHint, CObject* pHint)

OnUpdateViews 와 OnInitialUpdate 함수를 호출하는 함수, Update 함수는 Invalidate 함수를 호출하여 전체를 무효화한다. 그리고 두번째, 세번째 인자를 참조하여 뷰의 화면 일부만 무효화할 수 잇다.


Comments