본문 바로가기
VisualStudio.C++.C#

VC++ MDI 프로젝트의 다중 문서 템플릿 구조에서 OnFileNew 신규추가

by i.got.it 2016. 2. 15.

 

 

개요

 

 

해결 대상 문제.

MFC 로 MDI 프로젝트에서 다중문서 템플릿을 마법사만으로 생성한 경우 MDI 실행프로그램 메뉴 -> 파일 -> 새로만들기 .. 클릭한 경우 (아래 그림)

 

아래 처럼 대화상자 "새로만들기"가 뜨면서 다중문서 템플릿중 어떤 것을 새로 만들것인지 물어본다. 본 예에서는 2종의 다중문서 템플릿이 있는 상태고,따라서 2종 중에서 어떤 것을 새로 만들지 대화창에서 물어보고 있다.

 

다중문서템플릿을 갖는 MDI 실행프로그램에서는 위와 같은 형식보다는 각각의 다중문서별로 메뉴에서 새로만들기를 지정할 수 있는 구조가 훨씬 편리하다. 즉, 메뉴에서  New 클릭하면 서브로 신규 생성할 문서템플릿을 선택할 수 있는 메뉴가 있고, 이것을 클릭했을대 해당하는 문서템플릿이 새로 만들어지게 한다.

 

구현하기.

요점. 위와 같은 방식으로 작동되게 하려면 ID_FILE_NEW 메시지 처리하는 핸들러 OnFileNew 를 우리 코드에 추가하여 구현한다.

 

참고. 기본 생성된 MDI 프로젝트에서 ID_FILE_NEW 메시지 핸들러인 OnFileNew는 클래스 CWinApp 의 protected 멤버함수로 되어있으며, 기본 제공되는 OnFileNew의 기능이 앞에서 보인 대화창을 보이면서 새문서를 선택하라는 기능으로 구현되어있다. 우리는 기본 제공 기능이 마음에 들지 않으므로 우리 코드에서 OnFileNew 를 오버라이딩 하여 새로운 기능을 구현하려는 것임.

 

본글의 이후 설명은 이전 글 (http://igotit.tistory.com/610  MDI 프로젝트에 신규 문서 템플릿 추가하기)  이후의 코드 구현 사항.

아래 상세 에서 정리.

 

 

 

 

 

상세

 

 

1. OnFileNew 추가하기.

우리의 MDI 프로젝트에서 클래스 CCySignalAPP (MFC MDI 위저드로 생성시 CWinApp 를 베이스 클래스로 하는 클래스임) 에서 클래스 위저드 실행시켜. 아래그림의 붉박 처럼 선택하고 오른쪽 버튼 처리기 추가.. 클릭한다.

 

 

 CCySignal.cpp 파일의 상단 메시지맵에  붉줄처럼 ID_FILE_NEW 에 대한 처리기 OnFileNew() 가 추가된다.

주의 : 위 파박처럼 기본생성되어있던 메시지핸들러 연결은 주석처리한다. 

새로추가된 OnFileNew 함수 정의엔 아래 처럼 코드 추가한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
void CCySignalApp::OnFileNew()
{
    CDocTemplate*  pDocTemplate = nullptr; 
 
    POSITION pos = GetFirstDocTemplatePosition();// 링크드리스트의 첫번째 위치잡기. 
 
    for (int i = 0; i < m_poscntDocTemp; i++)    // 문서의 링크드리스트에 등록된 순번 만큼 이동처리루프.
        pDocTemplate = GetNextDocTemplate(pos);  // 링크드리스트의 다음포지션으로.
 
    pDocTemplate->OpenDocumentFile(NULL);    
}
 

 

상기 코드에서 굵은글자 m_poscntDocTemp 는 문서템플릿에 추가한 순서에 따라 1부터 번호를 할당하면 된다.

변수 m_poscntDocTemp 에 번호를 지정하여 OnFileNew가 호출되면 해당 문서가 뜨게 된다.

 

상기 메뉴 각각의 메시지 처리기의 코드를 아래 처럼 추가한다.

 

1
2
3
4
5
6
7
8
9
10
11
void CCySignalApp::OnFileNewChart()
{
    m_poscntDocTemp = 1; 
    OnFileNew();
}
 
void CCySignalApp::OnFileNewSignal()
{
    m_poscntDocTemp = 2;
    OnFileNew();
}

이제 실행시켜 보면 메뉴의 각 문서 타입을 클릭하면 해당 문서가 뜬다.

 

 

만일, 기본 대화창에서 물어보는 방식도 유지하려는 경우엔 아래처럼 코딩하면된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void CCySignalApp::OnFileNew()
{
    if (m_poscntDocTemp == 0)
    {
        CWinApp::OnFileNew();
    }
    else
    {
        CDocTemplate*  pDocTemplate = nullptr;
 
        POSITION pos = GetFirstDocTemplatePosition();// 링크드리스트의 첫번째 위치잡기. 
 
        for (int i = 0; i < m_poscntDocTemp; i++)    // 문서의 링크드리스트에 등록된 순번 만큼 이동처리루프.
            pDocTemplate = GetNextDocTemplate(pos);  // 링크드리스트의 다음포지션으로.
 
        pDocTemplate->OpenDocumentFile(NULL);
    }
    
}
 
void CCySignalApp::OnFileNewChart()
{
    m_poscntDocTemp = 1; 
    OnFileNew();
    m_poscntDocTemp = 0;
}
 
void CCySignalApp::OnFileNewSignal()
{
    m_poscntDocTemp = 2;
    OnFileNew();
    m_poscntDocTemp = 0;
}
 
 

 

 






 본 글이 포함된 상위 정리 장소.

 

 Visual Studio/VC++/C/C# 활용정리 -> http://igotit.tistory.com/11

 

 

 

///666.


댓글



 

비트코인




암호화폐       외환/나스닥/골드         암호화폐/외환/나스닥/골드
     
현물 |선물 인버스 |선물 USDT       전략매니저(카피트레이딩)         프랍 트레이더 온라인 지원가능. MT4,MT5