티스토리 뷰
CRUNTIME_CLASS
1
2
3
4
5
6
7
8
9
10 |
struct CRuntimeClass // 중요부분만 정의
{
LPCSTR m_lpszClassName;
int m_nObjectSize;
CObject* (*m_pfnCreateObject)();
CObject* CreateObject() {
return (*m_pfnCreateObject)(); //함수 포인터를 사용
}
...
}; |
cs |
DECLARE_DYNCREATE(CMFCApplication2View) 는 아래 처럼 3줄로 변환된 코드가 된다.
1
2
3
4
5
6
7
8
9
10 |
class CMFCApplication2View : public CView
{
...
protected:
// DECLARE_DYNCREATE(CMFCApplication2View) // 이 매크로는 아래 3줄로 변환된다
static const AFX_DATA CRuntimeClass classCMFCApplication2View;
virtual CRuntimeClass* GetRuntimeClass() const;
static CObject* PASCAL CreateObject();
}; |
cs |
IMPLEMENT_DYNCREATE(CMFCApplication2View, CView) 는 아래와 같이 변환된다.
1
2
3
4
5
6
7
8
9
10 |
// IMPLEMENT_DYNCREATE(CMFCApplication2View, CView) // 이 매크로는 아래 코드처럼 변환된다.
CObject* PASCAL CMFCApplication2View::CreateObject()
{ return new CMFCApplication2View; }
AFX_COMDAT const AFX_DATADEF CRuntimeClass CMFCApplication2View::classCMFCApplication2View = {
L"CMFCApplication2View", sizeof(classCMFCApplication2View), 0xFFFF, CMFCApplication2View::CreateObject, ((CRuntimeClass*)(&CView::classView)), NULL };
CRuntimeClass* CMFCApplication2View::GetRuntimeClass() const
{ return ((CRuntimeClass*)(&CMFCApplication2View::classCMFCApplication2View)); } |
cs |
프로젝트 만들때마다 매번 구현해야 하는 코드라서 매크로로 만들어두고 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13 |
BOOL CMFCApplication2App::InitInstance()
{
...
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMFCApplication2Doc),
RUNTIME_CLASS(CMainFrame), // 주 SDI 프레임 창입니다.
RUNTIME_CLASS(CMFCApplication2View));
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
} |
cs |
1
2
3 |
// RUNTIME_CLASS(CMFCApplication2View)); // 이 매크로는 아래와 같다.
((CRuntimeClass*)(&CMFCApplication2View::classCMFCApplication2View)); |
cs |
RUNTIME_CLASS() 매크로는 뷰 클래스(CMFCApplication2View) 정보를 갖는 포인터를 CRuntimeClass* 형으로 변환 시킨다.
결국, 도큐먼트 템플릿은 Doc, MainFrame, View 클래스 정보를 갖는 포인터를 생성자 인자로 전달한다.
실제로 도큐먼트 템플릿 생성자 코드는 아래와 같다.
1
2 |
CSingleDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass,
CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass); |
cs |
참고>
http://lowchen.tistory.com/207
http://zelda.tistory.com/24