Dialog에 View 클래스 추가 하는 방법 (쉽게 하는방법)
C++ 2007. 10. 26. 15:46 |Dialog Form (MFC) 를 개발하다 보면 CView, CScroll, CHtmlView 등과 같은
뷰의 클래스를 추가 하고 싶을때가 있다.
하지만 동적으로 생성하는 방법을 사용해서
CMyView* pMyView = new CMyView();
pMyView.Create(...);
pMyView.ShowWindow(SW_SHOW);
이런 방법을 사용하게 되면 생성후에 화면에 제대로 나오는걸 확인할 수 있다.
하지만 종료할때 보면 디버그 에러가 발생하게 된다.
자세한 이유는 모르겠다. 하지만 분명한건 아래와 같은 RUNTIME_CLASS() 를 사용해서 생성해야 하는걸 확인하였다.
아래와 같이 코드를 작성해서 추가를 해보면 이상없이 동작하는 것을 확인할 수 있다.
///
BOOL CDlgTestViewDlg::OnInitDialog()
{
...
CCreateContext pContext;
/**
* Note:CDialig derived pointer is converted to
* CWnd pointer (a common base class for CDialog and CFrameWnd).
* Thus casting it back to CFrameWnd is also easy.
*/
CWnd* pFrameWnd = this;
pContext.m_pCurrentDoc = new CDocument;
pContext.m_pNewViewClass = RUNTIME_CLASS(CTestView);
CTestView *pView =
(CTestView *) ((CFrameWnd*)pFrameWnd)->CreateView(&pContext);
ASSERT(pView);
pView->ShowWindow(SW_NORMAL);
/**
* After a view is created, resize that to
* have the same size as the dialog.
*/
CRect rectWindow;
rectWindow = CRect(10, 10, 100, 100);
/**
* Leave a little space for border and title...
*/
pView->MoveWindow(rectWindow);
...
return TRUE;
}
뷰의 클래스를 추가 하고 싶을때가 있다.
하지만 동적으로 생성하는 방법을 사용해서
CMyView* pMyView = new CMyView();
pMyView.Create(...);
pMyView.ShowWindow(SW_SHOW);
이런 방법을 사용하게 되면 생성후에 화면에 제대로 나오는걸 확인할 수 있다.
하지만 종료할때 보면 디버그 에러가 발생하게 된다.
자세한 이유는 모르겠다. 하지만 분명한건 아래와 같은 RUNTIME_CLASS() 를 사용해서 생성해야 하는걸 확인하였다.
아래와 같이 코드를 작성해서 추가를 해보면 이상없이 동작하는 것을 확인할 수 있다.
///
BOOL CDlgTestViewDlg::OnInitDialog()
{
...
CCreateContext pContext;
/**
* Note:CDialig derived pointer is converted to
* CWnd pointer (a common base class for CDialog and CFrameWnd).
* Thus casting it back to CFrameWnd is also easy.
*/
CWnd* pFrameWnd = this;
pContext.m_pCurrentDoc = new CDocument;
pContext.m_pNewViewClass = RUNTIME_CLASS(CTestView);
CTestView *pView =
(CTestView *) ((CFrameWnd*)pFrameWnd)->CreateView(&pContext);
ASSERT(pView);
pView->ShowWindow(SW_NORMAL);
/**
* After a view is created, resize that to
* have the same size as the dialog.
*/
CRect rectWindow;
rectWindow = CRect(10, 10, 100, 100);
/**
* Leave a little space for border and title...
*/
pView->MoveWindow(rectWindow);
...
return TRUE;
}