Nasıl YAPıLıR: <a1>Destek</a1> iki dosya uzantılarını MFC belge türü başına

Makale çevirileri Makale çevirileri
Makale numarası: 141921 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Microsoft Foundation Classes (MFC) belge veya görünümü mimarisine sahip her belge tipi ile ilişkili en fazla bir dosya uzantısı ile oluşturulan uygulamalar. Bu varsayılan dosya uzantısı belirttiyseniz, belge şablonu dize dize tabloda saklanan depolanır.

Genellikle, iki dosya uzantılarını, belirli bir belge tipi ile ilişkilendirmek yararlıdır. Bu makalede, belge şablonu dizesinde depolanmak üzere iki dosya uzantılarına izin vermek için kullanabileceğiniz bir teknik açıklanır. Sınıf türetme ve işlevi geçersiz kılar, her iki dosya uzantılarını belge şablonuyla ilişkilendirilecek olasıdır.

Daha fazla bilgi

Adım adım yordam

Tek bir belge tipi SDI ya da MDI uygulamalarda iki dosya uzantısını ilişkilendirmek için aşağıdaki adımları kullanın.

  1. Iki dosya uzantıları içeren dize tablosu girdisi değiştirin. Iki uzantısını (örneğin, .aaa; .bbb) noktalı virgülle ayırarak filterExt alanına girilir. Belge şablonu dizesi buna benzer görünebilir:
       \nExts\nExts\nFiles (*.aaa; *.bbb)\n.aaa;.bbb\nExts.Doc\nExts Doc.
    					
  2. Bir sınıf CMultiDocTemplate SDI uygulamaları MDI uygulamaları veya CSingleDocTemplate türevi. Bu sınıf, projenize eklemek ve Belge şablonları kendi InitInstance oluştururken kullanmak işlevi. Yalnızca temel sınıf oluşturucu çağıran bir kurucu oluşturmanız gerekecek.
       CMyMultiDocTemplate::CMyMultiDocTemplate(
          UINT nIDResource, CRuntimeClass* pDocClass,
          CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass ) :
          CMultiDocTemplate(nIDResource, pDocClass, pFrameClass, pViewClass)
          { };
    					
  3. Sınıfınıza CMultiDocTemplate veya CSingleDocTemplate 2. adımda elde GetDocString işlevinde geçersiz kılar.
       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. Böylece, bir dosya açıldığında, her iki dosya uzantılarını tanınıyor CMyMultiDocTemplate::MatchDocType geçersiz kılar.
       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. Kaydet ve DoSave geçersiz kılar, işlev doğru olarak kayıt yapmak için kullanacağınız CDocument türetilmiş bir sınıf işlevi. Yalnızca kesip MFC yapıştırdığınızda, türetilmiş bir sınıf içinde gelen Mfc\Src\Doccore.cpp CDocument::DoSave() uygulaması.

    Bu satırları değiştirin:
            // append the default suffix if there is one
            CString strExt;
            if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
                !strExt.IsEmpty())
            {
               ASSERT(strExt[0] == '.');
               newName += strExt;
            }
    						
    bu satırlarla:
            // 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;
            }
    						
    Kaydet, belge dizesinde belirtilen iki uzantılarına sahip bir belge tipi için işlenirken, varsayılan olarak ilk uzantısı kod satırlarını dönmek üç eklendi. Ikinci uzantılı belge dizesinde belirtilen kaydedilecek bir dosya varsa kullanıcı, bu uzantı üzerinde yazmalıdır.

    Aşağıdaki kod satırlarını değiştirmek de gereksinim duyacaksınız:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          DELETE_EXCEPTION(e);
          }
    						
    ile:
          CATCH_ALL(e)
          {
          TRACE0("Warning: failed to delete file after failed SaveAs.\n");
          e->Delete();     //modified
          }
    						
    DELETE_EXCEPTION() makro bu bağlamda tanımlanmamış için bu gereklidir.
  6. (yalnızca 16-bit sürümler) Sınıf Sihirbazı'nı, türetilmiş bir belge sınıfınızın OnFileSave ve OnFileSaveAs komut işleyicileri sağlamak için kullanın. Bu gerekli değildir çünkü Visual C++, the DoSave 16-bit sürümlerinde sanal işlev değil. Sadece kesin ve her iki Mfc\Src\Doccore.cpp işlevlerden temel sınıf sürümleri içeriğini, komut işleyicileri yapıştırın. Sonuç işlevlerini temel sınıf sürüm yerine DoSave yerel kopyasını arayın. # Eklemek gerekli olabilir "io.h" _access işlevi için bir tanım sağlamak için projenize içerir.

Referanslar

Lütfen, Microsoft Knowledge Base'de aşağıdaki makaleye bakın:
198538DocMgrEx.exe ASSOC birden çok dosya uzantıları w/1 belge türü

Özellikler

Makale numarası: 141921 - Last Review: 7 Aralık 2006 Perşembe - Gözden geçirme: 5.1
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Foundation Class Library 4.2, Ne zaman ne ile kullanilir:
    • Microsoft Visual C++ 1.0 Professional Edition
    • Microsoft Visual C++ 1.5 Professional Edition
    • Microsoft Visual C++ 1.51
    • Microsoft Visual C++ 1.52 Professional Edition
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 2.2
    • Microsoft Visual C++ 4.0 Standard Edition
Anahtar Kelimeler: 
kbmt kbdocview kbhowto KB141921 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:141921
Kullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.

Geri Bildirim Ver

 

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