CFormView를 이용한 간단한 프로그램을 만들 때 Visual C++ 에서 제공하는 Document/View Architecture를 사용할 경우 불필요한 작업이 많은 것 같아 이를 사용하지 않고 만드는 방법을 알아보았다. 


SDI 프로젝트를 만들때 Document/View Architecture 옵션을 제거하고 프로젝트를 만든 후 기본적으로 만들어지는 View외에 추가로 CFormView를 상속받는 View을 하나 만들어 기존 View와 교체를 하면 가능하였다.


하지만 새로운 View를 만들어 교체를 할 때 일반 변수를 이용하여 Stack에 만들경우 프로그램 종료시 에러가 발생하였다. 이미 해제된 View를 다시한 번 삭제하려 하기때문인 것 같았다. Heap 메모리에 만들어지도록 하면 문제가 없었다.


//CChildFormView.h
class CChildFormView : public CFormView
{
public:  // Change constructor to public. It is private by default
	CChildFormView();           // protected constructor used by dynamic creation
	virtual ~CChildFormView();
};




//CMainFrm.h
#include "ChildFormView.h"

class CMainFrame : public CFrameWnd
{
protected:  // control bar embedded members
	CChildFormView    *m_pWndView;
};




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

	// First, build the view context structure
	CCreateContext ccx;

	// Designate the class from which to build the view
	ccx.m_pNewViewClass = RUNTIME_CLASS(CChildFormView);

	// Using the structure, create a view
	m_pWndView = DYNAMIC_DOWNCAST(CChildFormView, this->CreateView(&ccx));

	// Did we succeed ?
	if (!m_pWndView)
	{
		TRACE0("Creation of view failed\n");
		return -1;
	}

	// Do layout recalc
	RecalcLayout();

	// Show the view and do an initial update
	m_pWndView->ShowWindow(SW_SHOW);
	m_pWndView->OnInitialUpdate();

	// Set this view active
	SetActiveView(m_pWndView);

	// Order it to resize the parent window to fit
	m_pWndView->ResizeParentToFit(FALSE);

	// create a view to occupy the client area of the frame
// 	if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
// 	{
// 		TRACE0("Failed to create view window\n");
// 		return -1;
// 	}

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

	return 0;
}


참조: https://www.codeproject.com/Articles/5445/Using-views-effectively-without-the-doc-view-overh

Posted by NeoDreamer

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절


BLOG main image
사람의 발목을 잡는건 '절망'이 아니라 '체념'이고 앞으로 나아가게 하는건 '희망'이 아니라 '의지'다. - 암스 중에서 - by NeoDreamer

공지사항

카테고리

전체보기 (774)
Thinking (2)
Nothing (5)
---------------* (0)
Dev Story (688)
Com. Story (75)
IT Story (1)
---------------+ (0)
Etc (2)
Total : 1,035,853
Today : 2 Yesterday : 25
Statistics Graph