<정적 분할 윈도우 - 폼뷰와 일반뷰 같이 쓰기 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() 함수 작성