티스토리 뷰

프로그래밍/MFC

MFC RUNTIME_CLASS

에어버스 2016. 6. 25. 11:46

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

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31