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 다중 템플릿
- 템플릿 자원을 만든다.
- 문자열 테이블에 IDR_MAINFRAME1을 넣는다.
IDR_MAINFRAME 밑에 넣되 IDR_SDITYPE과 같은 번호이면 안된다. (resource.h에서 확인한다) - 메뉴에 IDR_MAINFRAME1을 넣는다.
- 아이콘에 IDR_MAINFRAME1을 넣는다.
- 뷰 클래스(CTestView1)를 만든다.
- CTestApp::InitInstance()에 템플릿을 등록한다.
CSingleDocTemplate* pDocTemplate1;
pDocTemplate1 = new CSingleDocTemplate(
IDR_MAINFRAME1,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CTestView1)
);
AddDocTemplate(pDocTemplate1);
- 메인 메뉴의 File-New를 선택하면, 템플릿을 고르는 다이얼로그가 나타난다.
- 다이얼로그 없이 특정 템플릿을 직접 사용하려면, 템플릿 선택부분 대신에 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);
}
- 메인 메뉴에서 다른 템플릿을 부르는 항목을 추가하고, 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 다중 템플릿
- 템플릿 자원을 만든다.
- 문자열 테이블에 IDR_TESTTYPE1을 넣는다.
- 메뉴에 IDR_TESTTYPE1을 넣는다.
- 아이콘에 IDR_TESTTYPE1을 넣는다.
- 템플릿 클래스(CChildFrame1, CTestDoc1, CTestView1)를 만든다.
- CTestApp::InitInstance()에 템플릿을 추가로 등록한다.
CMultiDocTemplate* pDocTemplate1;
pDocTemplate1 = new CMultiDocTemplate(
IDR_TESTTYPE1,
RUNTIME_CLASS(CTestDoc1),
RUNTIME_CLASS(CChildFrame1),
RUNTIME_CLASS(CTestView1)
);
AddDocTemplate(pDocTemplate1);
- 초기 화면에서 템플릿을 나타나지 않게 하려면, 템플릿 선택부분을 해제한다.
/* if (!ProcessShellCommand(cmdinfo)) return FALSE; */ - 메인 메뉴에서 File-New에 해당하는 OnFileNew()를 만든다.
void CTestApp::OnFileNew()
{
POSITION pos = GetFirstDocTemplatePosition();
CMultiDocTemplate* pDocTemplate;
pDocTemplate = (CMultiDocTemplate *)GetNextDocTemplate(pos);
pDocTemplate->OpenDocumentFile(NULL);
}
- 메인 메뉴에서 다른 템플릿을 부르는 항목을 추가하고, 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. 다중 템플릿에서 비활성 클래스 포인터 얻기
- 템플릿 포지션을 얻는다.
POSITION pos = AfxGetApp()->GetFirstDocTemplatePosition(); - 원하는 템플릿을 찾는다. (예를 들면 2번째 템플릿)
CMultiDocTemplate* pDocTemplate;
pDocTemplate = (CMultiDocTemplate *)GetNextDocTemplate(pos);
pDocTemplate = (CMultiDocTemplate *)GetNextDocTemplate(pos); - 템플릿에서 도큐먼트 포지션을 얻는다.
POSITION pos1 = pDocTemplate->GetFirstDocPosition(); - 원하는 도큐먼트를 찾는다. (예를 들면 3번째 도큐먼트)
CDocument* pDoc;
pDoc = pDocTemplate->GetNextDoc(pos1);
pDoc = pDocTemplate->GetNextDoc(pos1);
pDoc = pDocTemplate->GetNextDoc(pos1);
pDocTemplate = (CMultiDocTemplate *)GetNextDocTemplate(pos1); - 도큐먼트에서 뷰 포지션을 얻는다.
POSITION pos2 = pDoc->GetFirstViewPosition(); - 원하는 뷰 포지션을 찾는다. (예를 들면 4번째 뷰)
CView* pView;
pView = pDoc->GetNextView(pos2);
pView = pDoc->GetNextView(pos2);
pView = pDoc->GetNextView(pos2);
pView = pDoc->GetNextView(pos2); - 뷰를 감싸고 있는 자식 프레임 윈도우를 얻는다.
CMDIChildWnd* pChild;
pChild = (CMDIChildWnd *)pView->GetParentFrame();
댓글