<정적 분할 윈도우 - 폼뷰와 일반뷰 같이 쓰기 1>

① 프로젝트 명: Split2
② SDI 과정 4/6 에서 Advanced - use split window 선택.
③ 리소스에서 insert 해서 formview 추가.
이때 Base class는 반드시 CFormView로 할 것.
④ class wizard로 formview에 연결된 클래스 생성 - 이름은 CForm 으로 함.
⑤ MainFrm.cpp를 다음과 같이 고친다.

// MainFrm.cpp : implementation of the CMainFrame class
.....
#include "MainFrm.h"
#include "Split2Doc.h"  //  -+
#include "Split2View.h" //   +- 추가 (순서중요)
#include "Form.h"       //  -+
......
// OnCreateClient() 함수 수정
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT /*lpcs*/,
        CCreateContext* pContext)
{
        m_wndSplitter.CreateStatic( this,1,2);
        m_wndSplitter.CreateView(0, 0, 
                RUNTIME_CLASS(CSplit2View), CSize(400,100), pContext);
        m_wndSplitter.CreateView(0, 1, 
                RUNTIME_CLASS(CForm), CSize(100,100), pContext);
        SetActiveView((CView *)m_wndSplitter.GetPane(0,0));
        return TRUE;
}

⑥ Document 에 test 라는 double형 변수를 추가.

⑦ Form.h 에 다음과 같이 GetDocument() 함수를 만들어 줌.

class CForm : public CFormView
{
............
// Attributes
public:
        CSplit2Doc* GetDocument();  // 추가
.........
}

// 다음 4줄: 뷰에서 '복사-붙여넣기' 해서 폼뷰 클래스명으로 수정
// 이것은 release 용 
#ifndef _DEBUG  // debug version in Form.cpp
inline CSplit2Doc* CForm::GetDocument()
   { return (CSplit2Doc*)m_pDocument; }
#endif

⑧ Form.cpp 의 내용을 다음과 같이 수정.

.........
#include "Split2Doc.h"  // 추가 (Doc가 먼저 View는 뒤에 추가)
#include "Split2View.h" // 추가
#include "Form.h"
.........
/////////////////////////////////////////////////////////////////////////////
// CForm diagnostics

#ifdef _DEBUG
..............
// GetDocument() 함수 추가
// 다음 5줄: 뷰에서 '복사-붙여넣기' 해서 폼뷰 클래스명으로 수정 
CSplit2Doc* CForm::GetDocument() // non-debug version is inline
{
        ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSplit2Doc)));
        return (CSplit2Doc*)m_pDocument;
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CForm message handlers

// 폼뷰에 있는 버튼의 메시지 핸들러
void CForm::OnButton1() 
{
        // TODO: Add your control notification handler code here
        
        CSplit2Doc *pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        
        UpdateData(true);
        pDoc->test = m_edit1;  // m_edit1 : class wizard에서 정한 에디트 박스의 변수 
        pDoc->UpdateAllViews(this);  // 도큐먼트에 연결된 모든 뷰 갱신 
                                         // 폼뷰는 갱신하지 않음
}

⑨ Split2View의 OnDraw() 함수작성

void CSplit2View::OnDraw(CDC* pDC)
{
        CSplit2Doc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        
        // TODO: add draw code for native data here
        CString str;
        str.Format("%f", pDoc->test);
        pDC->TextOut(10,10, str);
}
<정적 분할 윈도우 - 폼뷰와 일반뷰 같이 쓰기 2>

①~⑥ 까지 같은 순서로 작성.

⑦ 폼뷰 버튼의 메시지 핸들러를 다음과 같이 작성.

void CForm::OnButton1() 
{
        // TODO: Add your control notification handler code here

        // View를 둘러싼 FrameWindow의 포인터를 구함. 
        CFrameWnd *pFr = (CFrameWnd *)AfxGetMainWnd();
        // 이 포인터에서 활성화된 도큐먼트의 포인터를 구함. 
        CSplit2Doc *pDoc = (CSplit2Doc *)(pFr->GetActiveDocument());
        
        UpdateData(true);
        pDoc->test = m_edit1;
        pDoc->UpdateAllViews(this);  // formview는 갱신하지 않음
}

⑧ Form.cpp에 Document의 헤더파일 포함시킴

.........
#include "Split2Doc.h"  // 추가 (반드시 Form.h 앞에 추가할 것)
#include "Form.h"
.........

⑨ 방법1의 ⑨와 같이 Split2View의 OnDraw() 함수 작성