MFC

뷰(View) 동적으로 변경하기 - Dll 만들시 주의점

디버그정 2008. 9. 8. 17:07

뷰(View) 동적으로 변경하기

  • CCreateContext 클래스
    • Base 클래스를 가지지 않음.
    • 구조체로서 Frame 윈도우를 생성하고 document와 View가 연관되어질 때 사용하는 클래스
    • 윈도우가 생성될 때 이 구조체의 값들은 document와 view를 구성하는 component을 연결하기 위한 정보를 제공
  • RUNTIME_CLASS 이용
    • 지정하는 클래스에 대한 CRuntimeClass 구조체의 포인터를 리턴
    • DECLARE_DYNAMIC, DECLARE_DYNCREATE, DECLARE_SERIAL 매크로에 의해 선언된 CObject 파생 클래스만이 CRuntineClass 구조체 포인터를 리턴
BOOL CMainFrame::ChangeView()
{
	//Set MultiDownFormView => CView 상속 클래스
	CRuntimeClass *pClass = RUNTIME_CLASS(CMultiDownFormView);

	CView *pOldView = GetActiveView();
	CDocument *pDocument = pOldView->GetDocument();

	CCreateContext context;
	context.m_pLastView = NULL;
	context.m_pCurrentDoc = pDocument;
	context.m_pNewViewClass = pClass;
	context.m_pNewDocTemplate = pDocument ? pDocument->GetDocTemplate() : NULL;
	context.m_pCurrentFrame = this;

	CView *pNewView = STATIC_DOWNCAST(CView, CreateView(&context));
	pNewView->OnInitialUpdate();

	SetActiveView(pNewView);
	pNewView->ShowWindow(SW_SHOW);
	RecalcLayout();

	return TRUE;
}
주의할 점

View를 Extension DLL로 만들어 사용하는 경우
(1) Main 프로젝트는 반드시 Use MFC in Shared DLL 형식 (만약 static libarary로 지정하는 경우 View DLL의 RUNTIME_CLASS 함수 링크시 링크에러 발생-함수 못찾음)
(2) View DLL의 Dialog Template의 속성을 반드시 [VCPP:Style][VCPP:Child]로 지정