Skip to end of metadata
Go to start of metadata

MDI 형태는 SDI형태와 다르게 메인 프레임이 있으며 차일드 프레임과 View클래스 도큐먼트를 3개를 하나의 템플레이트로 설정
한개의 템플레이트를 이용하여 여러개의 윈도우를 출력할수 있는 형태

MDI의 각 클래스 포인터 얻기

BOOL CMdiContDlg::OnInitDialog() 

	CDialog::OnInitDialog();
	//각 클래스의 m_strData를 읽고 이것을 대화상자에 전송
	OnLoaddata();
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE


void CMdiContDlg::OnLoaddata() 

	//어플리케이션 클래스 포인터 얻기
	CExMdiContApp *pApp=(CExMdiContApp *)AfxGetApp();	
	//메인프레임 클래스 포인터 얻기
	CMainFrame *pFrame=(CMainFrame *)AfxGetMainWnd();
	//현재 활성돠 되어 잇는 차일드 프레임 클래스 얻기
	CChildFrame *pChild=(CChildFrame *)pFrame->GetActiveFrame();
	//도큐먼트 클래스 얻기
	CExMdiContDoc *pDoc=(CExMdiContDoc *)pChild->GetActiveDocument();
	//View 클래스 얻기
	CExMdiContView *pView=(CExMdiContView *)pChild->GetActiveView();

	//각클래스의 데이터를 대화상자와 연결된 맴버로
	m_strApp=pApp->m_strData;
	m_strMainFrame=pFrame->m_strData;
	m_strChildFrame=pChild->m_strData;
	m_strViewClass=pView->m_strData;
	m_strDocument=pDoc->m_strData;
	//맴버 데이터를 대화상자로 전송
	UpdateData(FALSE);
void CMdiContDlg::OnSavedata() 

	//자원에서 맴버로
	UpdateData(TRUE);
	//어플리케이션 클래스 포인터 얻기
	CExMdiContApp *pApp=(CExMdiContApp *)AfxGetApp();	
	//메인프레임 클래스 포인터 얻기
	CMainFrame *pFrame=(CMainFrame *)AfxGetMainWnd();
	//현재 활성돠 되어 잇는 차일드 프레임 클래스 얻기
	CChildFrame *pChild=(CChildFrame *)pFrame->GetActiveFrame();
	//도큐먼트 클래스 얻기
	CExMdiContDoc *pDoc=(CExMdiContDoc *)pChild->GetActiveDocument();
	//View 클래스 얻기
	CExMdiContView *pView=(CExMdiContView *)pChild->GetActiveView();
	//대화상자에 입력된 데이터를 각클래스의 맴버로
	pApp->m_strData=m_strApp;
	pFrame->m_strData=m_strMainFrame;
	pChild->m_strData=m_strChildFrame;
	pView->m_strData=m_strViewClass;
	pDoc->m_strData=m_strDocument;

MDI 다중 템플레이트

BOOL CExMdiTempApp::InitInstance()

	AfxEnableControlContainer();
#ifdef _AFXDLL
	Enable3dControls();		
#else
	Enable3dControlsStatic();	
#endif

	SetRegistryKey(_T("Local AppWizard-Generated Applications"));
	LoadStdProfileSettings(); 
	CMultiDocTemplate* pDocTemplate;
	pDocTemplate = new CMultiDocTemplate(
	IDR_EXMDITTYPE,
	RUNTIME_CLASS(CExMdiTempDoc),
	RUNTIME_CLASS(CChildFrame), // custom MDI child frame
	RUNTIME_CLASS(CExMdiTempView));
	AddDocTemplate(pDocTemplate);
   ①	AddDocTemplate(
		new CMultiDocTemplate(
		IDR_ANOTHERTYPE,
		RUNTIME_CLASS(CAnotherDoc),
		RUNTIME_CLASS(CAnotherFrame), 
		RUNTIME_CLASS(CAnotherView))
		);
	CMainFrame* pMainFrame = new CMainFrame;
	if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
		return FALSE;
	m_pMainWnd = pMainFrame;
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;
	pMainFrame->ShowWindow(m_nCmdShow);
	pMainFrame->UpdateWindow();
	return TRUE;

MDI 다중 템플레이트 선택적 로드

다중 템플레이트에서 로드된 여러 윈도우 얻기

  • No labels