View / Document / Frame ÀÇ ºÐ¸®

 

 À̹ø¿¡ ÇØ º¼ °ÍÀº MFCÀÇ AppWizard°¡ ±âº»ÀûÀ¸·Î ¸¸µé¾îÁÖ´Â Äڵ忡¼­ View / Document / FrameÀ» Â÷·Ê´ë·Î ºÐ¸®ÇØ º¸·Á°í ÇÑ´Ù. ¿ì¼±Àº ViewºÎÅÍ ¸ÕÀú ¶¼¾î³»º¸ÀÚ. ¿©±â¼­ ÇÁ·ÎÁ§Æ® À̸§À» Hack À̶ó°í Á¤Çß´Ù. ¿ì¼± AppWizard(exe)¿¡¼­ ¿É¼ÇÀº ±âÁ¸¿¡ ÀÖ´Â ±×´ë·Î Àû¿ëÇÏ¿© SDI ÇÁ·ÎÁ§Æ®¸¦ Çϳª ¸¸µç´Ù. (ºñÁÖ¾ó C++ 6 ÃÖÁ¾ºÐ¼®, º£½ºÆ®ºÏ)

- ViewÀÇ  Á¦°Å

1) ÇÁ·ÎÁ§Æ®¿¡¼­ HackView.h / cpp ÆÄÀÏÀ» Áö¿î´Ù.
2) Hack.cpp ÆÄÀÏ¿¡¼­ #include "HackView.h" ºÎºÐÀ» Áö¿î´Ù.
3) Hack.cpp ÆÄÀÏ¿¡¼­ ´ÙÀ½ ºÎºÐÀ» °íÄ£´Ù.

¿ø·¡ ÀÌ·± ³»¿ëÀ»

        CSingleDocTemplate* pDocTemplate;
        pDocTemplate = new CSingleDocTemplate(
                IDR_MAINFRAME,
                RUNTIME_CLASS(CHackDoc),
                RUNTIME_CLASS(CMainFrame),       // main SDI frame window
                RUNTIME_CLASS(CHackView));    // °íÄ¡±â Àü
        AddDocTemplate(pDocTemplate);
   
ÀÌ·¸°Ô °íÄ£´Ù.

        CSingleDocTemplate* pDocTemplate;
        pDocTemplate = new CSingleDocTemplate(
                IDR_MAINFRAME,
                RUNTIME_CLASS(CHackDoc),
                RUNTIME_CLASS(CMainFrame),       // main SDI frame window
                NULL);                               // °íÄ£ ÈÄ
        AddDocTemplate(pDocTemplate);

4) ±×·± ´ÙÀ½ ÄÄÆÄÀÏÇÏ¸é ºä°¡ ¾ø¾îÁø °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
   (¹º°¡ ´Þ¶óÁø °Ô Á¶±Ý º¸ÀÏ °ÍÀÌ´Ù)

 

- DocumentÀÇ Á¦°Å (ViewÀÇ Á¦°Å ÈÄ)

1) ÇÁ·ÎÁ§Æ®¿¡¼­ HackDoc.h / cpp ÆÄÀÏÀ» Áö¿î´Ù.
2) Hack.cpp ÆÄÀÏ¿¡¼­ #include "HackDoc.h" ºÎºÐÀ» Áö¿î´Ù.
3) Hack.cpp ÆÄÀÏ¿¡¼­ ´ÙÀ½ ºÎºÐÀ» °íÄ£´Ù. Document ±îÁö Áö¿ö¹ö¸®¸é DocTemplate°¡ ÀüÇô ÇÊ¿ä°¡ ¾ø±â ¶§¹®ÀÌ´Ù.

 View¸¦ Á¦°ÅÇÒ ¶§ °íÃÆ´ø ³»¿ëÀ»

        CSingleDocTemplate* pDocTemplate;
        pDocTemplate = new CSingleDocTemplate(
                IDR_MAINFRAME,
                RUNTIME_CLASS(CHackDoc),
                RUNTIME_CLASS(CMainFrame),       // main SDI frame window
                NULL);
        AddDocTemplate(pDocTemplate);

¸ðµÎ Áö¿ì°í ´ÙÀ½°ú °°ÀÌ °íÄ£´Ù.

        // ¸ÞÀÎ À©µµ¿ì¸¦ À§ÇÑ Å¬·¡½º º¯¼ö ¼±¾ð
        CMainFrame *pFrame = new CMainFrame();
        // ÇÁ·¹ÀÓ Á¦ÀÛ
        pFrame->LoadFrame(IDR_MAINFRAME);
        // ¸ÞÀÎ À©µµ¿ì·Î ÁöÁ¤
        m_pMainWnd = pFrame;

4) MainFrm.h ÆÄÀÏÀ» ¿­¾î¼­      CMainFrame()À» protected ¼Ó¼º¿¡¼­ public ¼Ó¼ºÀ¸·Î ¹Ù²Û´Ù.
5) ±×·± ´ÙÀ½ ÄÄÆÄÀÏÀ» ÇÑ´Ù. View¸¦ Á¦°ÅÇßÀ» ¶§¿Í °°Àº âÀÌ ¶á´Ù. Document´Â ´«¿¡ ¶çÁö ¾ÊÀ¸´Ï±î.

 

- FrameÀÇ Á¦°Å (View/Document Á¦°Å ÈÄ)

1) ÇÁ·ÎÁ§Æ®¿¡¼­ ¸®¼Ò½º ÆÄÀÏÀ» ¸ðµÎ Áö¿î´Ù. (*.rc *.ico, *.bmp µî)
2) MainFrm.cpp ÆÄÀÏÀ» ¿­¾î OnCreate() ÇÔ¼ö¸¦ º¸ÀÚ.

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
                return -1;
        
        if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
                | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
                !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
        {
                TRACE0("Failed to create toolbar\n");
                return -1;      // fail to create
        }

        if (!m_wndStatusBar.Create(this) ||
                !m_wndStatusBar.SetIndicators(indicators,
                  sizeof(indicators)/sizeof(UINT)))
        {
                TRACE0("Failed to create status bar\n");
                return -1;      // fail to create
        }

        // TODO: Delete these three lines if you don't want the toolbar to
        //  be dockable
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
        EnableDocking(CBRS_ALIGN_ANY);
        DockControlBar(&m_wndToolBar);

        return 0;
}  

¾ÕÀÇ ¼Ò½º ´ëºÎºÐÀ» Áö¿ö ´ÙÀ½°ú °°ÀÌ ¸¸µç´Ù.

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
                return -1;

        return 0;
}

3) MainFrm.h ÆÄÀÏÀ» ¿­¾î ´ÙÀ½ µÎ ¸â¹öº¯¼ö¸¦ Áö¿î´Ù. º¸´Ù½ÃÇÇ »óÅÂ¹Ù¿Í Åø¹Ù¸¦ À§ÇÑ °ÍÀÌ´Ù.

        CStatusBar  m_wndStatusBar;
        CToolBar    m_wndToolBar;

4) Hack.cpp ÆÄÀÏÀ» ¿­¾î Document¸¦ Á¦°ÅÇÒ ¶§ °íÃÆ´ø ºÎºÐÀ» º¸ÀÚ.

        // ¸ÞÀÎ À©µµ¿ì¸¦ À§ÇÑ Å¬·¡½º º¯¼ö ¼±¾ð
        CMainFrame *pFrame = new CMainFrame();
        // ÇÁ·¹ÀÓ Á¦ÀÛ
        pFrame->LoadFrame(IDR_MAINFRAME);
        // ¸ÞÀÎ À©µµ¿ì·Î ÁöÁ¤
        m_pMainWnd = pFrame;

 ¸®¼Ò½º¸¦ Áö¿ö¹ö·È±â ¶§¹®¿¡ ÀÌ ºÎºÐ¿¡¼­ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ °íÄ£´Ù.

        CMainFrame *pFrame = new CMainFrame();
        LPCTSTR new_class = AfxRegisterWndClass
                (CS_HREDRAW|CS_VREDRAW, 
                 LoadCursor(IDC_ARROW),
                 (HBRUSH)GetStockObject(WHITE_BRUSH));
        pFrame->Create(new_class, NULL,
                WS_OVERLAPPED|WS_SYSMENU, CRect(0, 0, 300, 100));
        m_pMainWnd = pFrame;

5) ÀÌÁ¦ ÄÄÆÄÀÏÇØ º¸¸é Åø¹Ùµµ ¾ø°í, ¸Þ´ºµµ ¾ø°í, »óŹٵµ ¾ø´Â ½ä··ÇÑ À©µµ¿ì°¡ Çϳª ¶ß´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù.