ПредишенСледващото

Така че, ние ще създадем програма, която:

  1. Той е в състояние да отваряте и записвате файлове в няколко формата, а в диалоговия прозорец Save, можете да изберете един от следните видове:
    1. Всички типове подкрепени (* .ex1; * .ex2; * .ex3)
    2. Първият тип (* .ex1)
    3. Вторият тип (* .ex2)
    4. Третият тип (* .ex3)
    5. Всички файлове (*. *)
    В диалоговия прозорец Save ще разполага с всички същите опции, с изключение на първия.
  2. Тя регистрира отварянето на файлове с тези разширения чрез двукратно щракване.
  3. При поискване, настаняване създава или не създава запис в контекстното меню "Създаване".
  4. Всеки един от тези три разширения сравнява неговата икона.

Започнете производителност

Така че, ние започнем AppWizard, обадете ни SDI приложение. В първия етап, изберете вида - един документ. сложите отметка Документ / Виж подкрепа архитектура. Английски език. Втората стъпка. не се нуждае от базата данни, сложи Няма. На трето място. контейнери, които не са необходими, Няма. Четвърто. Там се отмятат по желание, оставям всичко, тъй като е по подразбиране. Кликнете върху бутона Разширени и въведете параметрите на новото приложение:

След това можете да просто натиснете Finish. повече или по-малко важни настройки там. Ние съставят нашата нетна проект, и да го стартирате. Може да бъде всичко в програмата не е направено, деловодството настъпва автоматично при стартиране.

Сега искам да направя още едно отклонение, посветена на подробен анализ на това, което имаме точно това, което се вписва. Тук ще научите как файловете се записват в системата, както и че е писано в регистъра. Ако някой вече знае всичко това, следващия раздел могат да се пропуснат.

Регистрирайте файлове в системата

Предполагам, че тук, че читателят е запознат с факта, че такъв регистър, както и как да го използвате. Ако не - тя е посветена на много литература, така че тук са основните неща за разказване, аз няма.

За Windows е бил в състояние да работи с файла, иконата с молба да се промени memnyu контекст му и т.н. трябва да имате идентификатор регистров файл. Това е, което ние сме посочено в идентификационния номер на поле тип файл. Това е всъщност името на нашия тип файл от гледна точка на системата за. Всички видове файлове се съхраняват в клон на регистър [HKEY_CLASSES_ROOT] под едно и също наименование. Нека да разгледаме нашия нов клон тип файл: [HKEY_CLASSES_ROOT \ SDI.Document]. В този клон на опция (по подразбиране) (на английски версии на Windows - (По подразбиране)) съдържа името на типа на файла, както се показва на потребителя: Отворете някоя папка на диска, за да отворите контекстното меню, а има подменю New. ще видите, наред с други неща на "Файл без име" - нищо подобно? Това е стойността ние добавихме в името на новия файл (дълго име). а също така е параметър (подразбиране) клон [HKEY_CLASSES_ROOT \ SDI.Document].

Е, хайде да отидем по-нататък. Ние разширяваме тази клонка и да видите две подсекции: DefaultIcon и черупка .Vtoroy ние не се нуждаем, а това е на първо място в една и съща настройка (По подразбиране) по подразбиране съдържа иконата, която е свързана с този тип файлове.

Е, както е описано от типа на файла, ние демонтирани. Остава да разберете малко повече: как типа на файла е свързано с разширяването? Това е много проста. По същия ключ от системния регистър [HKEY_CLASSES_ROOT] изброява всички разширения - раздели, които започват с точка. Намери ли нашата експанзия - (! Важен момент) .ex1. Параметър (По подразбиране) на този раздел, ние виждаме само идентификатор на типа, който е приложен към това разширение, а именно - нашата SDI.Document.

И лявата точка до последния детайл, което ще ни е необходимо в бъдеще: това е наличието на под-ShellNew под [HKEY_CLASSES_ROOT \ .ex1]. Това е така, защото на този подраздел, а ние имаме нов тип файл за новото меню. Опитайте се да изтриете или преименувате ShellNew. и ще видите, че нашата "Файл без име" ще изчезне от менюто.

Така че сега ние знаем значението на три от седемте области пълни. Останалите полета не са свързани с регистъра, и се прилагат само за самата програма. А именно: Основна рамка надпис - това е просто заглавието на основния прозорец на кандидатстване; Име на филтъра - филтър се появява в диалоговия прозорец за отваряне и съхраняване на файлове; Док име тип - нашият вид името на програмна гледна точка на (ако ние Програмата поддържа няколко различни видове документи, които създавате ново да се появява диалогов прозорец с подкана да изберете вида на документа, за да се създаде име тип Doc. - е името, което се появява в списъка. нашата молба, тя няма да); File ново име (псевдоним) - името на новия dokumemnta подразбиране (в Мултискрининговите приложения за създаване на нов празен документ е разработен от името на този параметър плюс серийния номер).

Сега ние знаем, напълно смисъла на всички тези мистериозни манипулации, които направиха по-рано. Възможно е да започнете процеса на програма модификация според проблемът да бъде решен.

Добавянето на няколко разширения

Програмата поддържа само едно разширение - EX1. За да добавите необходимата EX2 и EX3. струна ресурси на нашата програма и гледат на идентификационна поредица IDR_MAINFRAME. Аз съм тук, аз няма да старателно описват този низ формат - бо-голямата част от него - това са линии, които вече казах, ако нещо не е ясно - предаде в MSDN. ) Сега сме на следващия важната част от тази линия: \ nSDI файлове (* .ex1) \ n.ex1 \ н. Ние го промените, както следва: \ nSDI файлове (* .ex1; * .ex2; * .ex3) \ n.ex1; .ex2; .ex3 \ н. Ние компилирате и стартирате нашата молба. Прозорците отворени и спаси, виждаме същите тези филтри и те работят! Наистина ли е толкова просто? Уви, това не е така. Погледнете в системния регистър: нашия тип файл е свързан с един много интересен разширение .ex1; .ex2; .ex3. Не много прилича ние се нуждаем от правилните видове регистрация файлове.

И сега да започне да танцува с дайре, която трябва да ни доведе до това, което искаме да се получат.

Така че, ние имаме проблем с разширение регистрация. Той е отговорен за регистрирането на метод CWinApp. RegisterShellFileTypes (). Въпреки това, ще вътре този метод, ние виждаме, че единственото смислено действие, което тя изпълнява, това е предизвикателство

m_pDocManager -> RegisterShellFileTypes (bCompat);

И сега метод CDocManager. RegisterShellFileTypes (BOOL bCompat) просто върши цялата работа за регистрация формати. Следователно, необходимо е да го предефинират за нас.

Създаване на нов клас CDocManagerEx. otnasledovanny от CDocManager. Сега SDI.cpp файл добавете линия

m_pDocManager = нов CDocManagerEx;

Сега ние трябва да замени метода CDocManagerEx. RegisterShellFileTypes (BOOL bCompat). Най-лесният начин да се направи нормално изпълнение - е да го копирате от източника на MFC.

Предупреждение. в MFC 4.2 този метод има малък glyuchok. Проектът на прикачен го поправя (нищо сериозно, само на регистрационен файл не е точно в условията, които трябва да се провеждат в съответствие с логиката на кода). В MFC 7.1, тази грешка се коригира.

Методът използва няколко константи и функции, които не са определени, така че те трябва да бъдат прехвърлени към нашия файл на един и същи файл, от където взехме по-горе код (това docmgr.cpp файл). Тези определения са в началото на този файл. За нашия код имаме нужда от всички константи и функция _AfxSetRegKey (.). В допълнение, трябва да се свържете afxpriv.h файл (аз го направих в stdafx.h файл), в противен случай кодът няма да се компилира.

Започваме сега сделката с нашите RegisterShellFileTypes. Този метод за всеки документ шаблон регистриран в заявлението (е, ние имаме само един) създава запис в системния регистър с съответния документ, регистрира отварянето на файловете на EXE файл и установява връзка между разширяването и типа на файла. Ако bCompat == TRUE. след отделяне на повече са регистрирани към една и съща команда за печат EXE-файла, запис се добавя върху иконата за вида на файлове и регистрира ключовата ShellNew за появата на нов тип файл от подменюто New.

За нашите цели, най-удобният вариант е да се създаде отделен метод за регистриране на някое конкретно. Декларирам, че като

булев RegisterSingleFileType (CDocTemplate * pTemplate. CString FilterExt,
вътр IconNum. BOOL bCompat. BOOL bShellNew);

Тук въведени следните параметри:
  • pTemplate. шаблон документ
  • FilterExt. файлово разширение (.ex1)
  • IconNum. брой икони за това разширение
  • bCompat. Лесно прехвърляне на параметър от RegisterShellFileTypes
  • bShellNew. провери - дали е необходимо да се създаде влизане в менюто Създаване

По този начин можете да се придвижвате почти всички съдържанието на RegisterShellFileTypes метода. трябва само да премахнете цикъл се изпълнява през всички шаблони на документи, както и да добавите състояние провери bShellNew флаг. На следващо място, поставете там код, който променя името на този тип файл (това е необходимо да се правят различни икони), няколко козметични допълнения, както и методът е готова.

Сега ние трябва да се определи RegisterShellFileTypes. Оставете го в сериала на шаблони на документи (в бъдеще, изведнъж се изисква.), Поставяне на гишето се увеличава номера икони и в този цикъл повикване RegisterSingleFileType с необходимите параметри. Остава само да добавим още две икони за желания тип файл, така реши за себе си - независимо дали искате да добавите този тип файлове с ново меню. Реших да не добавите този пост. Ако някой е много необходимо, мисля, че на читателя с тази трудна задача да се справят с ;-)

В момента почти всички задачи са били изпълнени. Имаше едно малко нещо - да се ощипвам диалогови прозорци за отваряне и съхраняване на файлове, така че те имат право да избират, необходими файлови филтри.

Първо ние редакция още един метод - CSingleDocTemplate. MatchDocType (). В тази версия на проблема е, като цяло, не е задължително. MatchDocType () метод е отговорен за определяне на типа на файла, за да се отвори. Ние имаме един вид (да не се бърка с разширението!), Така че голяма част от разликата няма да бъде. Но ако някой иска да променя програмата, така че да поддържа множество типове документи, този метод ще бъде от полза.

За да направите това, което трябва да се създаде клас otnasledovanny CSingleDocTemplate. Ние я наричаме CMyDocTemplate. предписват употребата на конструктора на базовия клас и добавете метод

виртуален Доверието MatchDocType (LPCTSTR lpszPathName. CDocument * rpDocMatch);

Изпълнение отнеме от източник MFC и коригира така, че разширението на файла не се сравнява с модел низ от вида ".ex1; .ex2; .ex3". и поотделно с всяка от разширения.

За съставяне на проекта, трябва да декларира функция в MyDocTemplate.cpp на файла

BOOL AFXAPI AfxComparePath (LPCTSTR lpszPath1 LPCTSTR lpszPath2.);

След това трябва да добавите заглавен файл shlwapi.h (най-добре да го направи в stdafx.h файл) и включват shlwapi.lib на библиотеката. След всичко това, ние се връщаме във файл SDI.cpp. ще го напиша в началото

и в метода на InitInstance () на търсене на линии

CSingleDocTemplate * pDocTemplate; pDocTemplate = нов CSingleDocTemplate (
IDR_MAINFRAME,
RUNTIME_CLASS (CSDIDoc),
RUNTIME_CLASS (CMainFrame), // прозорец основната рамка SDI
RUNTIME_CLASS (CSDIView));
AddDocTemplate (pDocTemplate);

и да се замени CSingleDocTemplate на CMyDocTemplate.

Така че, добре. Вземете си почине малко, и пак по някакъв начин. Много малко е останало.

За работата си с избор на файл е отговорен метод CDocManager. DoPromptFileName (). Клас CDocManagerEx вече имаме, така че има предимство пред мерките в място

виртуален BOOL DoPromptFileName (CString Име на файл. UINT nIDSTitle,
DWORD lFlags. BOOL bOpenFileDialog. CDocTemplate * pTemplate);

ако (! bOpenFileDialog) // В "Save As." диалоговия ние трябва да се премахне
strFilter. Празен (); // първия филтър - "SDI файлове (* .ex1 * .ex2 * .ex3)"

strFilter + = "SDI-1 файлове (* .ex1)";
strFilter + = (TCHAR) '\ 0 ";
strFilter + = _T ( "* .ex1");
strFilter + = (TCHAR) '\ 0 ";

strFilter + = "SDI-2 файлове (* .ex2)";
strFilter + = (TCHAR) '\ 0 ";
strFilter + = _T ( "* .ex2");
strFilter + = (TCHAR) '\ 0 ";

strFilter + = "SDI-3 файлове (* .ex3)";
strFilter + = (TCHAR) '\ 0 ";
strFilter + = _T ( "* .ex3");
strFilter + = (TCHAR) '\ 0 ";

За този метод на работа, ние все още трябва да добавите функция _AfxAppendFilterSuffix (). Дефиницията за него е в същия файл и методите за изпълнение CDocManager клас. Копирайте го от там и калайджия с в съответствие с това, което имаме сега основно шаблон няколко разширения. Между другото, тази функция е необходимо да се управлява само в MFC 4.2. MFC версия 7.1 вече съдържа код, който правилно дръжки шаблони с няколко разширения.

Е, последен щрих - добави код, които ще ни направят правилния разширението от неназован файл:

CString strExt;
ако (pTemplate -> GetDocString (strExt CDocTemplate filterExt) .. , strExt. IsEmpty ()) ASSERT (strExt [0] ==) ". ';
Int поз = името на файла. Намери (strExt);
ако (поз! = -1)
името на файла = името на файла. Left (поз) + '.' + StrDefault;
>

Този код се прибавя в края на DoPromptFileName на метод (), преди да се използва променливата името на файла.

Подкрепете проекта - споделете линка, благодаря!