Hogyan hozzunk létre egy MFC-alkalmazás támogatja a több fájl kiterjesztések, MFC, cikkek, programozás
Tehát, akkor hozzon létre egy programot, hogy:
- Ez képes fájlok megnyitása és mentése különböző formátumokban, míg a Mentés párbeszédpanelen, akkor válasszon egyet az alábbi típusok:
- Minden típus támogatott (* .ex1; * .ex2; * .ex3)
- Az első típus (* .ex1)
- A második típus (* .ex2)
- A harmadik típus (* .ex3)
- Minden fájl (*. *)
- Rögzíti a nyitó Az ilyen kiterjesztésű fájlokat dupla kattintással.
- Kérésre bejelentkezés hoz létre, vagy nem hoz létre egy bejegyzést a helyi menüben a „Create”.
- Mindhárom kiterjesztések le az ikonját.
Kezdés teljesítmény
Szóval, kezdjük a AppWizard, hívja SDI alkalmazás. Az első lépésben válassza ki a típus - Egységes dokumentum. beikszeljük Dokumentum / Nézet architektúra támogatása. Angol. A második lépés. Az adatbázis nem kell, tedd Semmi. Harmadik. konténerek nem szükséges Semmi. Negyedik. Vannak kipipálni az akarat, azt hagyni mindent, ahogy van alapértelmezés szerint. Kattintson a Speciális gombra, és adja meg a paramétereket az új alkalmazás:
Akkor csak meg kell nyomnia a Befejezés gombra. többé vagy kevésbé fontos beállítások ott. Mi lefordítani a net projekt és futtatni. Bármi lehet a programban nem történik meg, az iratok nyilvántartási jelentkezik indításkor automatikusan.
Most azt akarom, hogy még egy kitérőt szentelt egy részletes elemzést, amit mi csak mi illik. Itt megtudhatja, hogy a fájlok rögzítik a rendszerben, és hogy meg van írva a nyilvántartásban. Ha valaki már ismeri mindezt, a következő részben ki lehet hagyni.
Regisztrálj fájlokat a rendszer
Feltételezem, hogy itt az olvasó tisztában azzal a ténnyel, hogy egy ilyen adatbázis, és hogyan kell használni. Ha nem - akkor szentelt sok irodalomban, ezért itt az alapokat, hogy elmondja, nem fogom.
Windows tudott dolgozni a fájlt, az ikon kérve őt, hogy megváltoztassa a memnyu összefüggésben stb akkor kell egy registry file azonosítót. Ez az, amit már jelzett területen Fájl típus azonosítót. Ez valójában a neve a mi fájltípust a szempontból a rendszer. Minden típusú fájlok tárolása a ághoz [HKEY_CLASSES_ROOT] alatt ugyanazt a nevet. Nézzük meg az új ága a fájltípust: [HKEY_CLASSES_ROOT \ SDI.Document]. Ebben ága opció (alapértelmezett) (angol nyelvű Windows-verziók - (alapértelmezett)) tartalmaz egy fájltípust név, ahogyan a felhasználónak: Nyitott minden mappát a meghajtó nyissa meg a helyi menüt, és ott almenü Új. látni fogja, többek között a „névtelen fájl” - nem olyan, mint? Ez az érték van hozzá a fájl új nevét (hosszú név). és ez is egy paraméter (alapértelmezett) ága [HKEY_CLASSES_ROOT \ SDI.Document].
Nos, menjünk tovább. Bővítjük ezt a gallyat, és látni a két alfejezetben: DefaultIcon és shell .Vtoroy nincs szükségünk, és ez az első az azonos beállítás (alapértelmezett) alapértelmezés szerint tartalmazza az ikon, ami jár, hogy ezt a fájltípust.
Nos, amint azt a fájltípust, akkor lebontották. Továbbra is, hogy megtudja, egy kicsit: milyen a fájltípus társítva a terjeszkedés? Ez nagyon egyszerű. Ugyanebben regisztrációs kulcs [HKEY_CLASSES_ROOT] felsorolja az összes kiterjesztés - olyan szakaszok, amelyek kezdődhet ponttal. Talál ott terjeszkedési - .ex1 (fontos pont!). Paraméter (alapértelmezett) az e szakasz, azt látjuk, csak egy típus azonosítót, amely csatlakozik a meghosszabbítás - nevezetesen a SDI.Document.
És a bal oldali pont az utolsó részlet, amit meg kell a jövőben: ez a jelenléte al-ShellNew alatt [HKEY_CLASSES_ROOT \ .ex1]. Ez azért van, mert ezen alszakasz és van egy új fájltípust a New menüt. Próbáld törölni vagy átnevezni ShellNew. és látni fogja, hogy a „névtelen fájl” eltűnik a menüből.
Tehát most már tudjuk a jelentését a három hét mező ki van töltve. A többi mező nem kapcsolódnak a rendszerleíró adatbázisban, és csak a maga a program. Nevezetesen: Fő ablakkonfigurációs - ez csak a címe az alkalmazás főablakát; Szűrő neve - szűrő megjelenik a párbeszédablak fájlok megnyitása és elmentése; Doc típus neve - a típus a program neve szempontból (ha a program támogatja több különböző típusú dokumentumokat, hogy hozzon létre egy új ablak jelenik meg, hogy Ön kiválassza a dokumentum létrehozását Doc típus neve -. A név látható a listán. mi alkalmazás, akkor nem); Fájl új neve (rövid név) - a neve az új alapértelmezett dokumemnta (osztott alkalmazásokat létrehozni egy új, üres dokumentum jön létre a nevét ez a paraméter, valamint a sorozatszám).
Most teljesen ismerjük a jelentését minden titokzatos manipulációk tette korábban. Lehetőség van a program elindításához módosítási eljárás szerint a problémát meg kell oldani.
Hozzáadása több kiterjesztéssel
A program jelenleg csak egy kiterjesztés - EX1. Ahhoz, hogy az szükséges EX2 és EX3. nyílt szöveges erőforrások programunk, és nézd meg azonosítóját húr IDR_MAINFRAME. Itt vagyok én, nem alaposan leírja ezt a format string - bo legtöbb belőle - ezek a sorok, amelyek már azt mondta, ha valami nem világos - továbbítja az MSDN-en. ) Most a következő fontos része ennek a sort: \ NSDI fájlok (* .ex1) \ n.ex1 \ n. Mi változik meg az alábbiak szerint: \ NSDI fájlok (* .ex1; * .ex2; * .ex3) \ n.ex1; .ex2; .ex3 \ n. Mi lefordítani és futtatni az alkalmazás. Az ablak nyitva, és mentse, azt látjuk, ugyanezek a szűrők és a munka! Valóban olyan egyszerű? Sajnos, ez nem az. Nézze meg a registry: a fájltípus társítva van egy nagyon érdekes kiterjesztés .ex1; .ex2; .ex3. Nem túl úgy tűnik, szükség van egy megfelelő regisztrációs fájltípusokat.
És most kezdődik párja tambura, ami vezet minket, mit akarunk kapni.
Szóval, van egy probléma a regisztrációs kiterjesztése. Ez felelős a regisztrációs CWinApp módszer. RegisterShellFileTypes (). Azonban bemegyek ezt a módszert, azt látjuk, hogy az egyetlen értelmes cselekvés, hogy végez, ez egy kihívás
m_pDocManager -> RegisterShellFileTypes (bCompat);
És most CDocManager módszer. RegisterShellFileTypes (BOOL bCompat) csak az összes munkát regisztrációs formátumokat. Ezért szükséges, hogy újra el nekünk.
Hozzon létre egy új osztályt CDocManagerEx. otnasledovanny származó CDocManager. Most SDI.cpp fájlt hozzá a következő sort
m_pDocManager = új CDocManagerEx;
Most arra van szükség, hogy felülbírálja az eljárás CDocManagerEx. RegisterShellFileTypes (BOOL bCompat). A legegyszerűbb módja annak, hogy egy normális végrehajtását -, hogy másolja a MFC forrásból.
Figyelmeztetés. az MFC 4.2 Ezzel a módszerrel egy kis glyuchok. A projekt egy csatlakoztatott fix it (semmi komoly, csak egy regisztrációs fájlt nem éppen a feltételeket, amelyek meg kell történnie, logikája szerint a kód). Az MFC 7.1, ezt a hibát kijavították.
A módszer számos konstansok és függvények, amelyek nincsenek definiálva, ezért át kell tenni a fájlt ugyanazon fájl, ahonnan vettük a fenti kódot (ez docmgr.cpp fájl). Ezek a meghatározások az elején ezt a fájlt. A mi kódot szükségünk van minden állandók és funkció _AfxSetRegKey (.). Ezen kívül meg kell csatlakoztatni afxpriv.h fájlt (tettem rá stdafx.h file), ellenkező esetben a kód nem fordul le.
Kezdjük most a helyzet a mi RegisterShellFileTypes. Ez a módszer minden dokumentum sablon regisztrált az alkalmazást (ez, már csak egy) létrehoz egy registry bejegyzést a megfelelő azonosító, regisztrálja megnyitása a fájlok EXE-fájlt, és kapcsolatot teremt a meghosszabbítás és a fájl típusát. Ha bCompat == TRUE. majd halad tovább bejegyzett azonos nyomtatási parancs EXE-fájl, egy bejegyzés kerül az ikonra a fájlok típusát, és regisztrálja a kulcs ShellNew a megjelenése egy új típusú fájlt az almenüből Új.
A mi szempontunkból, a legkényelmesebb megoldás az, hogy hozzon létre egy külön eljárás regisztrációs adott kiterjesztése. Deklarálja azt
bool RegisterSingleFileType (CDocTemplate * pTemplate. CString FilterExt,
int IconNum. BOOL bCompat. BOOL bShellNew);
- pTemplate. dokumentum sablon
- FilterExt. fájl kiterjesztését (.ex1)
- IconNum. számú ikonok ez a kiterjesztés
- bCompat. Könnyen át a paramétert RegisterShellFileTypes
- bShellNew. check - függetlenül attól, hogy létre kell hozni egy bejegyzést a Create menü
Ebben az eljárásban tudja mozgatni szinte az összes tartalom a módszer RegisterShellFileTypes. akkor kell csak eltávolítani a ciklus végigmegy az összes dokumentum sablonok, és adjunk hozzá egy állapot megtekintéséhez bShellNew zászló. Ezután illessze ott kódot, amely módosítja a fájl típus neve (ez szükséges ahhoz, hogy a különböző ikonok), egy pár kozmetikai kiegészítései, és az eljárás kész.
Most már rögzíteni RegisterShellFileTypes. Hagyja a sablonok sor dokumentumot (a jövőben, hirtelen szükség van rá.) Beírása a számláló növekszik számok ikonok és ebben a ciklusban hívás RegisterSingleFileType a szükséges paramétereket. Továbbra is csak a két újabb ikonokat a kívánt fájltípust, így eldöntheti, hogy - akár akarja adni ezt a fájltípust a New menüt. Elhatároztam, hogy nem a bejegyzést hozzá. Ha valaki nagyon szükséges, azt hiszem, az olvasó ezzel ijesztő feladat lehet kezelni magad ;-)
Abban a pillanatban, szinte az összes feladatot teljesítették. Volt egy kis dolog -, hogy csípés dialógusok megnyitására és mentésére fájlokat, hogy azok szabadon választhatnának a szükséges fájlt szűrőket.
Először módosítjuk még egy módszer - CSingleDocTemplate. MatchDocType (). Ebben a változatban a probléma, általában, de nem feltétlenül. MatchDocType () metódus felelős típusának meghatározására a megnyitni kívánt fájlt. Van egy típusát (nem tévesztendő össze a kiterjesztés!), Annyi a különbség nem lesz. De ha valaki azt akarja, hogy módosítja a programot úgy, hogy támogatja a több dokumentum típusokat, ez a módszer hasznos lesz.
Ehhez létre kell hoznunk egy osztály otnasledovanny CSingleDocTemplate. Mi úgy hívjuk CMyDocTemplate. előírják a használata az alap osztály konstruktora, és adjunk hozzá egy módszert
virtuális bizalom MatchDocType (LPCTSTR lpszPathName. CDocument * rpDocMatch);
Végrehajtás a forrásból MFC és korrigálja úgy, hogy a fájl kiterjesztése nem hasonlították össze a minta karakterlánc formájában”.ex1; .ex2; .ex3" . és külön-külön az egyes kiterjesztések.
A fordításhoz a projekt, akkor meg kell adni a függvény a fájl MyDocTemplate.cpp
BOOL AFXAPI AfxComparePath (LPCTSTR lpszPath1 LPCTSTR lpszPath2.);
Ezután meg kell adni a header fájlt shlwapi.h (a legjobb csinálni stdafx.h fájl), és tartalmazza a könyvtár shlwapi.lib. Mindezek után, akkor menj be egy fájlt SDI.cpp. írd az elején
és a InitInstance () metódus keres vonalak
CSingleDocTemplate * pDocTemplate; pDocTemplate = new CSingleDocTemplate (
IDR_MAINFRAME,
RUNTIME_CLASS (CSDIDoc),
RUNTIME_CLASS (CMainFrame), // fő SDI keretablak
RUNTIME_CLASS (CSDIView));
AddDocTemplate (pDocTemplate);
és cserélje CSingleDocTemplate a CMyDocTemplate.
Szóval, rendben. Pihenni egy kicsit, és ismét egy utat. Nagyon kevés marad.
Mert az ő munkája a fájl választóval felelős CDocManager módszer. DoPromptFileName (). Class CDocManagerEx már van, így a helyben felülbírálja
virtuális BOOL DoPromptFileName (CString fájlnevet. UINT nIDSTitle,
DWORD lFlags. BOOL bOpenFileDialog. CDocTemplate * pTemplate);
if (! bOpenFileDialog) // A „mentés másként”. dialógus el kell távolítanunk
strFilter. Üres (); // Az első szűrő - "SDI fájlok (* .ex1; * .ex2; * .ex3)"
strFilter + = "SDI-1 fájlok (* .ex1)";
strFilter + = (TCHAR) '\ 0';
strFilter + = _T ( "* .ex1");
strFilter + = (TCHAR) '\ 0';
strFilter + = "SDI-2 fájlok (* .ex2)";
strFilter + = (TCHAR) '\ 0';
strFilter + = _T ( "* .ex2");
strFilter + = (TCHAR) '\ 0';
strFilter + = "SDI-3 fájlok (* .ex3)";
strFilter + = (TCHAR) '\ 0';
strFilter + = _T ( "* .ex3");
strFilter + = (TCHAR) '\ 0';
Annak érdekében, hogy ez a módszer működik, mi kell még hozzá _AfxAppendFilterSuffix () függvényt. Ez a meghatározás az ugyanabban a fájlban a végrehajtás CDocManager osztály módszerek. Másolja le ott, és bütykölni szerint mi van most alapvetően egy sablon több kiterjesztése. Mellesleg, ez a funkció szükséges határozni csak MFC 4.2. MFC 7.1-es verzió már tartalmazza a kódot, hogy a megfelelően kezeli sablonok több kiterjesztéssel.
Nos, az utolsó érintés - add kódot tesz bennünket a helyes kiterjesztése egy meg nem nevezett file:
CString strExt;
if (pTemplate -> GetDocString (strExt CDocTemplate filterExt) .. . strExt. IsEmpty ()) ASSERT (strExt [0] ==) '';
int pos = fileName. Találd (strExt);
ha (poz! = -1)
fileName = fileName. Bal (pos) + '' + StrDefault;
>
Ez a kód a végéhez közel adagoltuk a módszer DoPromptFileName (), mielőtt a változó fileName fogják használni.