티스토리 뷰

MFC

[MFC] MDI, SDI, Document Template (multi, single)

열혈허슬러 상추님 2019. 11. 11. 11:17
190718-2
 

MDI
 
SDI
1.CWinApp
2.CFrameWnd
3.CDocument
4.CView
 
MDI
1. CWinApp
2-1. CMDIFrameWnd
2-2. CMDIChildWnd
3. CDocument
4. CView
 
 
Document Template : 데이터에 따라서 틀이 만들어 지더라. 데이터에 따라서 뷰가 결정되고 외관의 틀이 결정되고 리소스가 결정되고... 
 
BOOL CMDIApp::InitInstance()
    // 애플리케이션의 문서 템플릿을 등록합니다. 문서 템플릿은
    // 문서, 프레임 창 및 뷰 사이의 연결 역할을 합니다.
    CMultiDocTemplate* pDocTemplate;
    pDocTemplate = new CMultiDocTemplate(IDR_MDITYPE,
        RUNTIME_CLASS(CMDIDoc),
        RUNTIME_CLASS(CChildFrame), // 사용자 지정 MDI 자식 프레임입니다.
        RUNTIME_CLASS(CMDIView));
    if (!pDocTemplate)
        return FALSE;
    AddDocTemplate(pDocTemplate); // APP에 등록 해야 doc,frame, view 리소스가 작동할 수 있다.
 
모달리스는 프레임에 만든다. 프레임은 프로그램 도는 동안에는 있을 거니까.
 

[다중 도큐먼트 메뉴 템플릿]
 
리소스
프레임
128번 130번
우리도 리소스 아이디가 있어야한다.
 
기본적으로 메뉴와 툴바 (복사해서 만듬)
 
- 텍스트 뷰 뜰 때마다
App은 도큐먼트 템플릿을 리스트로 갖는다.
도큐먼트 템플릿은 다시 doc들을 리스트로 갖는다.
 
BOOL CDocinfoDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
 
    // TODO: 여기에 추가 초기화 작업을 추가합니다.
    int nDT = 0;
    int nDoc = 0;
    int nView = 0;
 
    CWinApp* pApp = AfxGetApp();
 
    POSITION posDT = pApp->GetFirstDocTemplatePosition();
    while (posDT)
    {
        ++nDT;
        CDocTemplate* pDT = pApp->GetNextDocTemplate(posDT);
 
        POSITION posDoc = pDT->GetFirstDocPosition();
        while (posDoc) {
            ++nDoc;
            CDocument* pDoc = pDT->GetNextDoc(posDoc);
 
            POSITION posView = pDoc->GetFirstViewPosition();
            while (posView)
            {
                ++nView;
                CView* pView = pDoc->GetNextView(posView);
            }
        }
    }
    m_nDT = nDT;
    m_nDOC = nDoc;
    m_nVIEW = nView;
    UpdateData(FALSE);
 
 
    return TRUE; // return TRUE unless you set the focus to a control
                 // 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
    
}
 
void CMDIApp::OnMdi()
{
    // TODO: 여기에 명령 처리기 코드를 추가합니다.
    POSITION pos = GetFirstDocTemplatePosition();
    CMultiDocTemplate* pDT = (CMultiDocTemplate*)GetNextDocTemplate(pos);
    pDT->OpenDocumentFile(NULL);
}
 
 
void CMDIApp::OnText()
{
    // TODO: 여기에 명령 처리기 코드를 추가합니다.
    POSITION pos = GetFirstDocTemplatePosition();
    GetNextDocTemplate(pos); // 텍스트 도큐먼트 템플릿으로 바꾸기 위해 한 번 더 호출
    CMultiDocTemplate* pDT = (CMultiDocTemplate*)GetNextDocTemplate(pos);
    pDT->OpenDocumentFile(NULL);
}
- 새창열기 따로다로 만든 코드
공유하기 링크
TAG
댓글
댓글쓰기 폼