Методические УКАЗАНИЯ: Как для расширения поддержки два на каждый документ MFC

Переводы статьи Переводы статьи
Код статьи: 141921 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

Приложения, построенные с помощью документов Microsoft Foundation Classes (MFC) или представление архитектуры иметь не более одного расширения файла связанные с каждым Тип документа. Этот файл расширение по умолчанию, если указано, хранится в Строка шаблона документа хранятся в таблице строк.

Часто полезно для связывания двух расширений файлов с данного документа тип. В данной статье описывается способ можно использовать два файла расширения для хранения в строке шаблона документа. Через класс функция переопределения и наследования, можно сопоставить оба файла расширения с помощью шаблона документа.

Дополнительная информация

Пошаговые инструкции

Используйте следующие шаги для связывания двух расширений файлов с помощью одного Тип документа в приложениях MDI или SDI.

  1. Измените записи в таблицу строк, содержит два расширения файла. Два расширения, вводятся в поле filterExt, разделенных точка с запятой (например, .aaa;.bbb). Строка шаблона документа может выглядеть следующим образом:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. Создать производный класс CMultiDocTemplate для приложения MDI, или CSingleDocTemplate для приложения SDI. Добавить этот класс в проект и использовать его при создании шаблонов документов в вашем InitInstance функция. Необходимо будет создать конструктор, который просто вызывает конструктор базового класса.
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. Переопределить функцию GetDocString в свой класс, производный от CMultiDocTemplate или CSingleDocTemplate на шаге 2.
       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 Реализация CDocument::DoSave() из Mfc\Src\Doccore.cpp в вашем производный класс.

    Замените следующие строки:
            // 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 в классе производные документа. Это необходимые так как в 16-разрядных версиях Visual C++, DoSave функция не является виртуальным. Просто вырежьте и вставьте содержимое базы класс версии обеих функций из Mfc\Src\Doccore.cpp в вашем обработчики команд. Результирующая функции вызова локальной копии DoSave вместо версии базового класса. Может оказаться необходимым добавить # включить «io.h» для проекта, чтобы предоставить определение для функции _access.

Ссылки

Обратитесь к следующей статье Microsoft Knowledge Base:
198538 W/1 Assoc несколько расширений файлов типа документов DocMgrEx.exe

Свойства

Код статьи: 141921 - Последний отзыв: 2 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Foundation Class Library 4.2 на следующих платформах
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 1.52 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
Ключевые слова: 
kbdocview kbhowto kbmt KB141921 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:141921
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com