* 도큐먼트
도큐먼트 데이터에 접근하기 위한 인터페이스 제공
데이터를 저장하고 읽어옴
저장 매체와 뷰 사이의 매개 역할
뷰
도큐먼트의 정보를 윈도우에 출력하는 역할
구조는
저장 매체 - 도큐먼트 - 뷰
* CDocument 클래스
데이터를 관리하는 클래스
프로그램이 사용하는 데이터를 만들고, 읽고, 저장
OnNewDocument()
새로운 도큐먼트 만들기
Serialize()
도큐먼트의 내용을 디스크에서 읽어오고 저장
OnNewDocument()와 Serialize() 모두 정의만 되어있고
실제 코드는 비어 있음
오버라이딩 필요
virtual BOOL OnNewDocument()
virtual void Serialize(CArchive & ar)
* CArchive 클래스
c++의 iostream과 비슷
도큐먼트의 데이터를 읽고 쓰기 위한
삽입(<<)과 추출(>>) 연산자 정의
이진 삽입 연산자 <<
데이터를 순차적으로 저장할 때 사용
저장은 메모리에 있는 데이터가 파일로 전송되는 것
이잔 추출 연산자 >>
데이터를 순차적으로 읽을 때 사용
열기는 파일에 있는 데이터가 메모리로 전송되는 것
CArchive & operator << (CArchive &, Type &); // 데이터 저장
CArchive & operator >> (CArchive &, Type &); // 데이터 읽기
객체를 읽고 쓸 때
ReadObject()와 WriteObject() 쓸 것을 권장
IsStoring()
현재 데이터를 저장하는 중인지 읽어오는 중인지
알아내는 함수
1. 저장 중이면 TRUE
2. 읽는 중이면 FALSE
반환
Serialize()
인자로 CArchive의 객체인 ar 사용
데이터를 저장할 때는 <<로 ar에 데이터를 밀어 넣음
데이터를 읽어올 떄는 >>로 ar에서 데이터를 꺼내옴
!! 저장하거나 읽어오는 데이터의 순서는 같아야 한다 !!
OnOpenDocument() 혹은 OnSaveDocument()에서 자동으로 호출
* Serialize()
직렬화 (Serialize)
저장 매체에 데이터를 저장하고 읽어 들이는 과정
MFC의 직렬화는 Serialize()에 정의돼 있으므로
오버라이딩해서 사용하면 됨
MFC에서는 도큐먼트 클래스가 자기 자신의 데이터를 관리
Serialize(CArchive & ar)
이미 만들어진 코드에 덧붙이기만 하면 된다
void C...Doc::Serailize(CArchive & ar) {
CMainFrame * pFrame = (CMainFrame *)AfxGetMainWnd(); // 사용자 작성 코드 #include "MainFrm.h" 필요
C...View * pView = (C...View *)pFrame->GetActiveView(); // 사용자 작성 코드 #include "...View.h" 필요
if (ar.IsStoring()) {
ar << pView->m_str;
}
else {
ar >> pView->m_str;
}
}
* 파일 입출력
프로그램에서 만들어낸 정보를 저장 매체에 파일로 저장하거나
저장해 놓은 파일을 다시 읽어오는 기능
파일 메뉴에 열기와 저장이 있다
데이터를 저장할 때는
1. OnSaveDocument() 함수 실행
2. CFile 클래스를 이용하여 해당 파일을 열어
3. CArchive 클래스를 통로로 데이터 저장
데이터를 읽어올 때는
1. OnOpenDocument() 함수 실행
2. CFile 클래스를 이용하여 해당 파일을 열어
3. CArchive 클래스를 통로로 데이터 읽어옴
파일을 읽거나 저장할 때
최후에 데이터가 저장되거나 읽어오는 부분은 Serialize()에 의해 설정
이 때 CArchive 클래스의 객체가 Serialize()의 인자로 사용
* 리스트 박스의 데이터 항목
속성 창의 데이터 항목에
A...;B...;C...;D...;
이런 식으로 작성
대화 상자 클래스를 사용할 때는
웬만해선 소스 코드에 대화 상자 클래스 정보가 없으므로
대화 상자 헤더를 include 해줘야 된다
#include "... .h"
* GetFirstViewPosition()
도큐먼트와 관련된 뷰들의 리스트에서
첫 번째 뷰의 위치를 가져오기 위해 사용
CDocument의 멤버 함수
virtual POSITION GetFirstViewPosition() const
ex)
OnNewDocument() {}에서
POSITION pos = GetFirstViewPosition();
C...View * pView = (C...View *)GetNextView(pos);
* GetNextView()
rPosition 도큐먼트의 뷰를 호출하는 함수
CDocument의 멤버 함수
virtual CView * GetNextView(POSITION & rPosition) const
rPosition
GetFirstViewPosition 멤버 함수의 POSITION에 대한
이전 호출에서 반환된 값에 대한 GetNextView 참조
* 템플릿
애플리케이션의 여러 자원과 메인 프레임 클래스, 뷰 클래스, 도큐먼트 클래스 등을
하나의 묶음으로 가지는 클래스
* SDI 템플릿 (Single Document Interface)
뷰 클래스, 도큐먼트 클래스, 메인 프레임 클래스가
하나의 템플릿으로 구성된 것
하나의 도큐먼트를 갖는다
도큐먼트 - 뷰 구조에서
도큐먼트는 데이터를 읽고 저장하는 기능을 함
ex) 메모장, 그림판
* SDI에서 클래스 인스턴스 얻어오기
AfxGet...() 사용
CWinApp의 포인터를 반환하므로
적절한 형 변환 필요
애플리케이션 클래스의 인스턴스 얻어오기
AfxGetApp() 사용
ex) CExSDIApp * pApp = (CExSDIApp *)AfxGetApp()
메인 프레임 클래스의 인스턴스 얻어오기
AfxGetMainWnd() 사용
ex) CMainFrame * pFrame = (CMainFrame *)AfxGetMainWnd()
뷰 클래스의 인스턴스 얻어오기
메인 프레임 클래스의 인스턴스를 얻은 후
GetActiveView() 사용
GetActiveView()가 CMainFrame 클래스의 멤버 함수이기 때문
ex) CExSDIView * pView = (CExSDIView *)pFrame->GetActiveView()
도큐먼트 클래스의 인스턴스 얻어오기
메인 프레임 클래스의 인스턴스를 얻은 후
GetActiveDocument() 사용
GetActiveDocument()가 CMainFrame 클래스의 멤버 함수이기 때문
ex) CExSDIDoc * pDoc = (CExSDIDoc *)pFrame -> GetActiveDocument()
* MDI 템플릿
여러 개의 도큐먼트를 가지는 템플릿
여러 개의 문서 객체를 갖는다
SDI는 CSingleDocTemplate 클래스로 템플릿을 등록하는 한편
MDI는 CMultiDocTemplate 클래스로 템플릿을 등록
메인 프레임 클래스와 자식 프레임 클래스가 존재
* !! MDI에서 클래스의 인스턴스 얻어오기 !!
애플리케이션 클래스의 인스턴스 얻어오기
SDI와 동일하게 AfxGetApp() 사용
ex) CExMDIApp * pApp = (CExMDIApp *)AfxGetApp()
메인 프레임 클래스의 인스턴스 얻어오기
SDI와 동일하게 AfxGetMainWnd() 사용
ex) CMainFrame * pFrame = (CMainFrame *)AfxGetMainWnd()
자식 프레임 클래스의 인스턴스 얻어오기
메인 프레임의 멤버 함수인 GetActiveFrame() 사용
따라서 메인 프레임의 인스턴스를 먼저 얻어야 한다
ex) CChildFrame * pChild = (CChildFrame *) pFrame->GetActiveFrame()
뷰 클래스의 인스턴스 얻어오기
SDI와 마찬가지로 GetActiveView() 사용
SDI와 다르게 자식 프레임의 멤버 함수를 사용해야 됨
따라서 메인 프레임과 자식 프레임의 인스턴스를 먼저 얻어야 한다
ex) CExMDIView * pView = (CExMDIView *)pChild->GetActiveView()
도큐먼트 클래스의 인스턴스 얻어오기
GetActiveDocument() 사용
뷰 클래스와 동일하게 메인 프레임과 자식 프레임의 인스턴스를 얻어야 한다
ex) CExMDIDOC * pDoc = (CExMDIDOC *)pChild->GetActiveDocument()
* 새 창과 새로 만들기
새 창
현재 활성화 돼 있는 문서의 도큐먼트를 공유
새로 만들기
공유하지 않는 독립적인 도큐먼트 객체 생성
'소프트웨어학부 > 윈도우 프로그래밍' 카테고리의 다른 글
04장. 대화상자 (0) | 2024.10.24 |
---|---|
03장. 메시지 처리 (0) | 2024.10.23 |
02장. MFC 개요 및 아키텍처 (0) | 2024.10.23 |
01장. 윈도우 프로그래밍의 이해 (0) | 2024.10.23 |