본문 바로가기
Programming/MFC,C++

SDI/MDI 관련 포인터 및 뷰생성

by 기적 2013. 4. 8.

I. SDI의 각 클래스 포인터 얻기

  • 애플리케이션 클래스 포인터 
       CTestApp *pApp = (CTestApp *)AfxGetApp();
  • 메인 프레임 클래스 포인터 
       CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
  • 도큐먼트 클래스 포인터 
       CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); 
       CTestDoc *pDoc = (CTestDoc *)pFrame->GetActiveDocument();
  • 뷰 클래스 포인터 
       CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); 
       CTestView *pView = (CTestView *)pFrame->GetActiveView();

II. SDI 템플릿 등록

	BOOL CTestApp::InitInstance()
	{
		CSingleDocTemplate* pDocTemplate;
		pDocTemplate = new CSingleDocTemplate(
			IDR_MAINFRAME,
			RUNTIME_CLASS(CTestDoc),
			RUNTIME_CLASS(CMainFrame),
			RUNTIME_CLASS(CTestView)
		);
		AddDocTemplate(pDocTemplate);
	}

III. SDI 다중 템플릿

  1. 템플릿 자원을 만든다.
    • 문자열 테이블에 IDR_MAINFRAME1을 넣는다. 
         IDR_MAINFRAME 밑에 넣되 IDR_SDITYPE과 같은 번호이면 안된다. (resource.h에서 확인한다)
    • 메뉴에 IDR_MAINFRAME1을 넣는다.
    • 아이콘에 IDR_MAINFRAME1을 넣는다.
  2. 뷰 클래스(CTestView1)를 만든다.
  3. CTestApp::InitInstance()에 템플릿을 등록한다.
    	CSingleDocTemplate* pDocTemplate1;
    	pDocTemplate1 = new CSingleDocTemplate(
    		IDR_MAINFRAME1,
    		RUNTIME_CLASS(CTestDoc),
    		RUNTIME_CLASS(CMainFrame),
    		RUNTIME_CLASS(CTestView1)
    	);
    	AddDocTemplate(pDocTemplate1);
  4. 메인 메뉴의 File-New를 선택하면, 템플릿을 고르는 다이얼로그가 나타난다.
  5. 다이얼로그 없이 특정 템플릿을 직접 사용하려면, 템플릿 선택부분 대신에 OnFileNew()로 대체한다. 
       if (!ProcessShellCommand(cmdinfo)) return FALSE; => OnFileNew(); 
       ClassWizard - CTestApp - ID_FILE_NEW = OnFileNew()
    	void CTestApp::OnFileNew()
    	{
    		POSITION pos = GetFirstDocTemplatePosition();
    		CDocTemplate* pDocTemplate;
    		pDocTemplate = GetNextDocTemplate(pos);
    		pDocTemplate->OpenDocumentFile(NULL);
    	}
  6. 메인 메뉴에서 다른 템플릿을 부르는 항목을 추가하고, OnFileNew1()을 만든다. 
       Resource - Menu - ID_FILE_NEW1 
       ClassWizard - CTestApp - ID_FILE_NEW1 = OnFileNew1()
    	void CTestApp::OnFileNew1()
    	{
    		POSITION pos = GetFirstDocTemplatePosition();
    		CDocTemplate* pDocTemplate;
    		pDocTemplate = GetNextDocTemplate(pos);
    		pDocTemplate = GetNextDocTemplate(pos);
    		pDocTemplate->OpenDocumentFile(NULL);
    	}

IV. MDI의 각 클래스 포인터 얻기

  • 애플리케이션 클래스 포인터 
       CTestApp *pApp = (CTestApp *)AfxGetApp();
  • 메인 프레임 클래스 포인터 
       CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
  • 자식 프레임 클래스 포인터 
       CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); 
       CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame();
  • 도큐먼트 클래스 포인터 
       CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); 
       CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame(); 
       CTestDoc *pDoc = (CTestDoc *)pChild->GetActiveDocument();
  • 뷰 클래스 포인터 
       CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd(); 
       CChildFrame *pChild = (CChildFrame *)pFrame->GetActiveFrame(); 
       CTestView *pView = (CTestView *)pChild->GetActiveView();

V. MDI 다중 템플릿

  1. 템플릿 자원을 만든다.
    • 문자열 테이블에 IDR_TESTTYPE1을 넣는다.
    • 메뉴에 IDR_TESTTYPE1을 넣는다.
    • 아이콘에 IDR_TESTTYPE1을 넣는다.
  2. 템플릿 클래스(CChildFrame1, CTestDoc1, CTestView1)를 만든다.
  3. CTestApp::InitInstance()에 템플릿을 추가로 등록한다.
    	CMultiDocTemplate* pDocTemplate1;
    	pDocTemplate1 = new CMultiDocTemplate(
    		IDR_TESTTYPE1,
    		RUNTIME_CLASS(CTestDoc1),
    		RUNTIME_CLASS(CChildFrame1),
    		RUNTIME_CLASS(CTestView1)
    	);
    	AddDocTemplate(pDocTemplate1);
  4. 초기 화면에서 템플릿을 나타나지 않게 하려면, 템플릿 선택부분을 해제한다. 
       /* if (!ProcessShellCommand(cmdinfo)) return FALSE; */
  5. 메인 메뉴에서 File-New에 해당하는 OnFileNew()를 만든다.
    	void CTestApp::OnFileNew()
    	{
    		POSITION pos = GetFirstDocTemplatePosition();
    		CMultiDocTemplate* pDocTemplate;
    		pDocTemplate = (CMultiDocTemplate *)GetNextDocTemplate(pos);
    		pDocTemplate->OpenDocumentFile(NULL);
    	}
  6. 메인 메뉴에서 다른 템플릿을 부르는 항목을 추가하고, OnFileNew1()을 만든다. 
       Resource - Menu - ID_FILE_NEW1 
       ClassWizard - CTestApp - ID_FILE_NEW1 = OnFileNew1()
    	void CTestApp::OnFileNew1()
    	{
    		POSITION pos = GetFirstDocTemplatePosition();
    		CMultiDocTemplate* pDocTemplate;
    		pDocTemplate = (CMultiDocTemplate *)GetNextDocTemplate(pos);
    		pDocTemplate = (CMultiDocTemplate *)GetNextDocTemplate(pos);
    		pDocTemplate->OpenDocumentFile(NULL);
    	}

VI. 다중 템플릿에서 비활성 클래스 포인터 얻기

  1. 템플릿 포지션을 얻는다. 
       POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition();
  2. 원하는 템플릿을 찾는다. (예를 들면 2번째 템플릿) 
       CMultiDocTemplate* pDocTemplate; 
       pDocTemplate = (CMultiDocTemplate *)GetNextDocTemplate(pos); 
       pDocTemplate = (CMultiDocTemplate *)GetNextDocTemplate(pos);
  3. 템플릿에서 도큐먼트 포지션을 얻는다. 
       POSITION pos1 = pDocTemplate->GetFirstDocPosition();
  4. 원하는 도큐먼트를 찾는다. (예를 들면 3번째 도큐먼트) 
       CDocument* pDoc; 
       pDoc = pDocTemplate->GetNextDoc(pos1); 
       pDoc = pDocTemplate->GetNextDoc(pos1); 
       pDoc = pDocTemplate->GetNextDoc(pos1); 
       pDocTemplate = (CMultiDocTemplate *)GetNextDocTemplate(pos1);
  5. 도큐먼트에서 뷰 포지션을 얻는다. 
       POSITION pos2 = pDoc->GetFirstViewPosition();
  6. 원하는 뷰 포지션을 찾는다. (예를 들면 4번째 뷰) 
       CView* pView; 
       pView = pDoc->GetNextView(pos2); 
       pView = pDoc->GetNextView(pos2); 
       pView = pDoc->GetNextView(pos2); 
       pView = pDoc->GetNextView(pos2);
  7. 뷰를 감싸고 있는 자식 프레임 윈도우를 얻는다. 
       CMDIChildWnd* pChild; 
       pChild = (CMDIChildWnd *)pView->GetParentFrame();

댓글