| 파일 | 소스코드 |
| 프로젝트 생성 | 프로젝트명: ObjTest
옵션: [v]단일문서, [v]문서/뷰 아키텍처 지원, 프로젝트 스타일: [MFC Standard] |
| 클래스 추가 | 프로젝트 메뉴에서 [클래스 마법사]를 이용하는 방법 (클래스 추가 -> MFC 클래스)
클래스 이름 CMyData 와 기본 클래스는 CObject 로 선택한다.
가상 소멸자 선택한다.
|
Serialize 함수 추가 | 클래스뷰에서 CMyData 선택 후 속성창에서 재정의 버튼을 누르면 추가 가능하다.
CMyData.h와 CMyData.cpp 파일에 Serialize() 함수가 추가 되었는지 확인해보자.
|
CMyData.h
수정 | #pragma once // 한번만 include 가능하게 해줌.
#include <afx.h>
// 직렬화(serialize) 설정하기 (빨간색 표시)
class CMyData : public CObject { DECLARE_SERIAL(CMyData);
public:
// 저장하고자 하는 멤버변수 선언 (파란색 표시)
CArray<TCHAR, TCHAR&>m_arrChar; // 문자열 저장 CArray<CPoint, CPoint&>m_arrPos; // 좌표 저장 CString m_name; // 이름정보 COLORREF m_color; // 색깔 정보
public: CMyData(); virtual ~CMyData(); void Serialize(CArchive& ar); }; |
CMyData.cpp
클래스 작성 | #include "stdafx.h" #include "CMyData.h"
// IMPLEMENT_SERIAL() 매크로를 추가하여 직렬화를 사용한다. IMPLEMENT_SERIAL(CMyData, CObject, 1);
CMyData::CMyData() { m_name = _T("클래스 기본 이름"); }
CMyData::~CMyData() { }
// Serialize()함수를 통해 데이터를 저장하고, 불러온다. void CMyData::Serialize(CArchive& ar) { CObject::Serialize(ar); // 부모 클래스 직렬화 실행
if (ar.IsStoring()) { // 저장하기 m_arrChar.Serialize(ar); // CArray m_arrPos.Serialize(ar); // CArray ar << m_name; ar << m_color; } else { // 불러오기 m_arrChar.Serialize(ar); // CArray m_arrPos.Serialize(ar); // CArray ar >> m_name; ar >> m_color; } } |
ObjTestDoc.h
객체 변수 추가 | #include "CMyData.h"
// CMyData 객체 변수 선언
class CObjTestDoc : public CDocument { protected: CObjTestDoc() noexcept; DECLARE_DYNCREATE(CObjTestDoc) public: CMyData m_mydata; ...
}; |
ObjTestDoc.cpp
Serialize() 함수 작성 | void CObjTestDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { m_mydata.Serialize(ar); } else { m_mydata.Serialize(ar); } } |
ObjTestView.cpp
왼쪽 마우스 클릭 | 왼쪽 마우스 버튼을 클릭하면 원을 그리며 클릭 위치의 데이터를 저장한다.
void CObjTestView::OnLButtonDown(UINT nFlags, CPoint point) { // 데이터 추가하기 CObjTestDoc* pDoc = GetDocument(); pDoc->m_mydata.m_arrPos.Add(point); // 원 그리기 CClientDC dc(this); dc.Ellipse(point.x - 20, point.y - 20, point.x + 20, point.y + 20);
CView::OnLButtonDown(nFlags, point); } |
ObjTestView.cpp
오른쪽 마우스 클릭 | 오른쪽 마우스 버튼을 클릭 하면 글자를 출력해보자. 다음 소스코드는 미완성 코드이다.
void CObjTestView::OnRButtonDown(UINT nFlags, CPoint point) { // 글자를 입력할 좌표를 얻는다. }
void CObjTestView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
int index; index = m_str.GetLength();
if (nChar == VK_BACK) { } else { }
CWnd::OnChar(nChar, nRepCnt, nFlags); }
|
ObjTestView.cpp
- 화면에 그려준다. | void CObjTestView::OnDraw(CDC* pDC) { CObjTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return;
// 화면에 표시 for (int i = 0; i < pDoc->m_mydata.m_arrPos.GetSize(); i++) { pDC->Ellipse(pDoc->m_mydata.m_arrPos[i].x - 20, pDoc->m_mydata.m_arrPos[i].y - 20, pDoc->m_mydata.m_arrPos[i].x + 20, pDoc->m_mydata.m_arrPos[i].y + 20); } } |
| 실험 | 버튼을 클릭한 후 저장한다.
프로그램을 껐다가 다시 실행한 후 불러오기를 한다. 그대로 원이 살아 있는지 확인한다.
|