HOWTO: MFC 문서 형식 당 2 지원 파일 확장명 방법

중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

141921
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
요약
Microsoft 기반 클래스 (MFC) 문서 또는 아키텍처 각 문서 형식과 관련된 많아야 한 파일 확장명이 보기를 사용하여 빌드된 응용 프로그램. 이 기본 파일 확장명은 지정하지 않으면 문자열 테이블에 저장된 문서 템플릿 문자열이 저장됩니다.

두 개의 파일 확장명을 사용하여 주어진된 문서 형식과 연결하려면 유용한 경우가 많습니다. 이 문서에서는 사용하여 두 개의 파일 확장명을 문서 템플릿 문자열 저장할 수 있도록 하는 방법을 설명합니다. 클래스 파생 및 함수 재정의를 통해 문서 서식 파일을 사용하여 두 파일 확장명에 연결할 수 있습니다.
추가 정보

단계별 프로시저

SDI 또는 MDI 응용 프로그램에서 하나의 문서 형식과 두 개의 파일 확장명을 연결하려면 다음 단계를 사용하십시오.

  1. 두 개의 파일 확장명을 포함하는 문자열 테이블 엔트리를 수정하십시오. 두 개의 확장명은 세미콜론 (예를 들어, .aaa, .bbb) 으로 구분하여 filterExt 필드에 입력됩니다. 문서 템플릿 문자열 다음과 비슷하게 표시될 수 있습니다:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.					
  2. 클래스를 CMultiDocTemplate에서 SDI 응용 프로그램은 MDI 응용 프로그램 또는 CSingleDocTemplate 파생시킵니다. 이 클래스는 프로젝트에 추가하고 사용자의 InitInstance 문서 템플릿을 만들 때 사용할 함수를. 단순히 기본 클래스 생성자를 호출하는 생성자를 만들어야 합니다.
       CMyMultiDocTemplate::CMyMultiDocTemplate(      UINT nIDResource, CRuntimeClass* pDocClass,      CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :      CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)      { };					
  3. 2단계에서 CMultiDocTemplate 또는 CSingleDocTemplate에서 파생된 클래스에 GetDocString 함수를 재정의합니다.
       BOOL CMyMultiDocTemplate::GetDocString(CString& rString,                            enum DocStringIndex i) const   {        CString strTemp,strLeft,strRight;        int nFindPos;        AfxExtractSubString(strTemp, m_strDocStrings, (int)i);        if(i == CDocTemplate::filterExt)  {          nFindPos=strTemp.Find(';');          if(-1 != nFindPos) {            //string contains two extensions            strLeft=strTemp.Left(nFindPos+1);            strRight=strTemp.Right(lstrlen((const            char*)strTemp)-nFindPos-1);            strTemp=strLeft+strRight;          }        }    rString = strTemp;    return TRUE;   }					
  4. 파일을 열 때 두 파일 확장명을 인식할 수 있도록 CMyMultiDocTemplate::MatchDocType 재정의할.
       CDocTemplate::Confidence CMyMultiDocTemplate::MatchDocType(const        char* pszPathName, CDocument*& rpDocMatch)   {        ASSERT(pszPathName != NULL);        rpDocMatch = NULL;        // go through all documents        POSITION pos = GetFirstDocPosition();        while (pos != NULL)        {           CDocument* pDoc = GetNextDoc(pos);           if (pDoc->GetPathName() == pszPathName) {              // already open              rpDocMatch = pDoc;              return yesAlreadyOpen;           }        }  // end while        // see if it matches either suffix        CString strFilterExt;        if (GetDocString(strFilterExt, CDocTemplate::filterExt) &&          !strFilterExt.IsEmpty())        {           // see if extension matches           ASSERT(strFilterExt[0] == '.');           CString ext1,ext2;           int nDot = CString(pszPathName).ReverseFind('.');           const char* pszDot = nDot < 0 ? NULL : pszPathName + nDot;           int nSemi = strFilterExt.Find(';');           if(-1 != nSemi)   {             // string contains two extensions             ext1=strFilterExt.Left(nSemi);             ext2=strFilterExt.Mid(nSemi+2);             // check for a match against either extension             if (nDot >= 0 && (lstrcmpi(pszPathName+nDot, ext1) == 0                 || lstrcmpi(pszPathName+nDot,ext2) ==0))               return yesAttemptNative; // extension matches           }           else           { // string contains a single extension             if (nDot >= 0 && (lstrcmpi(pszPathName+nDot,                 strFilterExt)==0))             return yesAttemptNative;  // extension matches           }        }        return yesAttemptForeign; //unknown document type   }					
  5. 저장 및 이름으로 함수를 제대로 저장, 해당 DoSave 재정의할 수 있도록 CDocument 파생된 클래스의 함수를. 잘라내기 및 붙여넣기 MFC에서 Mfc\Src\Doccore.cpp CDocument::DoSave() 구현은 파생 클래스로.

    이러한 줄 바꾸기:
            // append the default suffix if there is one        CString strExt;        if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&            !strExt.IsEmpty())        {           ASSERT(strExt[0] == '.');           newName += strExt;        }						
    이러한 줄:
            // append the default suffix if there is one        CString strExt;        if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&            !strExt.IsEmpty())        {          ASSERT(strExt[0] == '.');          int nSemi;                       //added          if(nSemi = strExt.Find(';'));    //added          strExt = strExt.Left(nSemi);     //added          newName += strExt;        }						
    있는 세 줄의 코드로 저장 문서 문자열에 지정된 두 개의 확장이 없는 문서 형식을 처리할 때 기본적으로 첫 번째 확장 반환 추가된. 파일이 문서 문자열에 지정된 두 번째 확장명으로 저장한 경우 사용자가 이 확장을 통해 입력해야 합니다.

    다음 코드 줄을 바꿀 필요가:
          CATCH_ALL(e)      {      TRACE0("Warning: failed to delete file after failed SaveAs.\n");      DELETE_EXCEPTION(e);      }						
    함께:
          CATCH_ALL(e)      {      TRACE0("Warning: failed to delete file after failed SaveAs.\n");      e->Delete();     //modified      }						
    DELETE_EXCEPTION() 매크로 이 컨텍스트에서 정의되지 않은 때문에 필요한 입니다.
  6. (16 비트 버전 전용) 클래스 마법사 파생된 문서 클래스의 OnFileSave 및 OnFileSaveAs 명령 처리기를 제공할 수 있습니다. 이 필요합니다 때문에 Visual C++를 사용하여 DoSave 16비트 버전의 함수를 가상 수 없습니다. 단순히 잘라내어 명령 처리기를 Mfc\Src\Doccore.cpp 두 함수에서 기본 클래스 버전의 내용을 붙여넣습니다. 기본 클래스 버전이 아닌 DoSave 로컬 복사본을 결과 함수를 호출합니다. # 추가하는 데 필요할 수 있습니다 "io.h" _access 함수에 대한 정의가 제공하기 위해 프로젝트에 포함됩니다.
참조
Microsoft 기술 자료의 다음 문서를 참조하십시오.
198538DocMgrEx.exe Assoc 다중 파일 확장명 w/1 문서 유형
1.50 kbinf 1.51 1.52 2.00 2.50 3.00 3.10

경고: 이 문서는 자동으로 번역되었습니다.

속성

문서 ID: 141921 - 마지막 검토: 12/04/2015 12:49:26 - 수정: 5.1

Microsoft Foundation Class Library 4.2

  • kbnosurvey kbarchive kbmt kbdocview kbhowto KB141921 KbMtko
피드백