190716-2
- 내일은 컨트롤과 윈도우
- 뷰는 Paint() 에서 그린다. Paint()에서는 document를 참고하여 그린다.
하나라도 수정이 된다면 SetModifiedFlag(true)를 하면된다.
- 새로운 문서(ctrl+n 등)를 했을 때
1. 'DeleteContents()'
2. 'OnInitialUpdate()'
-직렬화
객체
포메터
스트림(파일스트림, 네트워크스트림 등)
IO 장치에 입출력을 한다.
프로그램을 껏다가 켯을 때 필요한 객체들(객체집합)만 복원하면된다.
복원할 때 어떤 데이터인지를 알려면 해당 정보를 모두 저장해야한다. (모든 정보가 필요하다)
그리고 복원시에 포멧을 보고 알아내어 데이터를 복원해야한다.
시리얼라이즈(직렬화) -> 저장을 할 때는 복원가능한 바이트배열로 만들어진다.
즉, 객체를 복원가능한 바이트 배열로 만드는 작업이다.
반대로, 다시 데이터로 가져올 때를 '역직렬화' 라고 한다.
어떻게 저장할지 형식을 지정하는것이 formatter이다.
- 직렬화 (파일 저장/불러오기)
// CDrawDoc serialization
void CDrawDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
int size = m_shapeList.GetSize();
ar << size;
for (int i = 0; i < size; i++)
{
ar << m_shapeList[i].m_rt;
}
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
int size;
ar >> size;
for (int i = 0; i < size; i++)
{
CRect rt;
ar >> rt;
m_shapeList.Add(rt);
}
}
}
-스트림 객체 'CArchive& ar' 아카이브 객체 : 파일과 연결된 객체
// CDrawDoc serialization
void CDrawDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 여기에 저장 코드를 추가합니다.
int size = m_shapeList.GetSize();
ar << size;
for (int i = 0; i < size; i++)
{
ar << m_shapeList[i].m_rt;
ar << m_shapeList[i].m_shapeType;
ar << m_shapeList[i].m_pen;
ar << m_shapeList[i].m_Brush;
}
}
else
{
// TODO: 여기에 로딩 코드를 추가합니다.
int size;
ar >> size;
for (int i = 0; i < size; i++)
{
Shape s;
ar >> s.m_rt >> s.m_shapeType >> s.m_pen >> s.m_Brush;
m_shapeList.Add(s);
}
}
}
- 도형모양 및 색깔도 저장/불러오기
- 순수 가상함수 : 몸체만 갖는 가상함수 오버라이딩 필수
- 다른 언어에서는 abstract 키워드를 클래스 앞에서 붙여서 추상클래스를 나타내지만 c++에서는 순수가상함수를 한개 이상 포함하여 추상클래스를 나타낸다.
- cf. 커맨드 패턴 사용시 스위치문 제거가능
- 다형성 사용시 delete시 Shape형 delete 되므로 가상 소멸자를 만들어야한다.
- 읽을 때는 먼저 타입정보 알고 new로 객체 생성 뒤 Serialize 호출 하면된다.
- 전역함수연산자중복 필요
- 전역함수연산자중복을 하여 <<를 사용가능하게함.
#CArchive #operator<< #Serialize
- Archive객체가 Shape의 객체가 아니기 때문에 멤버함수로 오버로딩할 수 없다.
즉, 왼쪽(<<연산 에서) 객체가 외부 객체이기 때문에 멤버함수로 오버로딩할 수 없다.
때문에 전역함수로 오버로딩해야한다.
- 다형성을 이용한 Serialize()
- 다형성을 이용한 도형저장 부모타입포인터(Shape*)를 담는 CArray에 자식타입객체를 생성하여 Add한다.
- 다형성을 이용한 OnPaint() 발생시 List에 저장된 Shape들에게 Draw 메세지를 보내 각 객체타입에 맞게 오버라이딩된 Draw 함수를 호출함으로써 도형을 그린다.
#oldBrush #newPen #pOldPen #pOldBrush #newBrush
- 부모 소멸자를 virtual로 지정하면 자식 소멸자도 virtual로 만들어진다.
이후 delete시 동적 바인딩되어 본인객체에 맞는 소멸(delete)이 이루어진다. (가상테이블에 등록되어 그 테이블을 참조하여 소멸이 이루어 진다.(?))
'MFC' 카테고리의 다른 글
[MFC] 스크롤바 설정(제한), Using Views in Frames (0) | 2019.11.07 |
---|---|
[MFC] Calling up mainframe, Modaless dialog (0) | 2019.11.06 |
[MFC] Modal Dialog, Databinding 직접해주기 (0) | 2019.11.05 |
[MFC] 메세지 맵, 상단 메뉴 사용 등 (0) | 2019.09.24 |
MFC (Microsoft Foundation Classes) (0) | 2019.09.23 |