GSI

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;
}
Posted by gsi
: