Możesz to zrobić w bardzo prosty sposób - wystarczy nadać każdemu elementowi ten sam identyfikator (na przykład, IDR_MAINFRAME) i wywołać metodę LoadFrame przekazując do niej ten identyfikator. Wywołanie tej metody spowoduje, że MFC stworzy ramkę oraz automatycznie załaduje odpowiednie zasoby i skojarzy je z oknem ramki. Ramki SDI używają pierwszej części łańcucha zasobu jako swojego tytułu. Łańcuch ten służy do wielu celów (używany jest on także przez szablon dokumentu). To właśnie dlatego musisz go dzielić na odrębne pola używając do tego znaku “\n". Nowa ramka stworzona za pomocą szablonu dokumentu także użyje metody LoadFrame. Podczas tworzenia nowej ramki użyte zostaną także inne pola zdefiniowane w łańcuchu zasobów.
Wewnątrz ramki możesz własnoręcznie tworzyć nowe widoki posługując się do tego metodą CreateYiew. Postępowanie takie jest jednak przysparzaniem sobie dodatkowych problemów, gdyż metoda ta nie wykonuje za Ciebie żadnej pracy. Dlatego powinieneś pozwolić obiektom wchodzącym w skład szablonu dokumentu robić to, co potrafią najlepiej -tworzyć i kojarzyć ze sobą dokumenty, widoki i ramki.
CDocTemplate
Elementem łączącym dokumenty, widoki oraz ramki, są obiekty klasy CDocTemplate. Programy SDI używają w rzeczywistości obiektów klasy CSingleDocumentTemplate, natomiast programy MDI - obiektów klasy CMultiDocTemplate. Obie te klasy są klasami potomnymi klasy CDocTemplate.
Klasa CDocTemplate ma wiele interesujących składowych (patrz tabela 1.12). Większość z czynności wykonywanych przez obiekty tej klasy jest odpowiedzią na działania użytkownika (np.: wybranie z menu opcji Plik>Nowy lub Plik>Otwórz).
Tabela 1.12. Kluczowe składowe klasy CDocTemplate
Składowa Przeznaczenie
GetFirstDocPosition Zwraca obiekt klasy POS1TION poprzedzający pierwszy dokument na liście.
GetNextDoc Pobiera następny dokument z listy.
GetDocString Zwraca określone pole łańcucha znaków zasobu dokumentu
CreateNewDocument Tworzy nowy dokument.
CreateNewFrame Tworzy nowe okno ramki wraz z towarzyszącymi mu obiektami widoku i dokumentu.
InitialUpdateFrame Powoduje wywołanie metody OnlnitialUpdate we wszystkich widokach ramki.
SaveAllModified Zapisuje wszystkie dokumenty.
CloseAllDocuments Zamyka wszystkie dokumenty.
OpenDocumentFile Otwiera plik, lub tworzy nowy, pusty dokument.
SetDefaultTitlef Umożliwia zmianę domyślnego tytułu.
Szablon dokumentu używa tego samego łańcucha znaków przechowywanego w zasobach programu, który jest wykorzystywany przez ramkę. Łańcuch ten jest w rzeczywistości złożony z siedmiu części, oddzielonych od siebie znakami “\n" (patrz tabela 1.13). Identyfikator łańcucha znaków podajesz podczas tworzenia szablonu dokumentu. Oprócz tego, podczas tworzenia szablonu dokumentu, będziesz musiał podać także nazwę klasy widoku, dokumentu oraz ramki.
Tabela 1.13. Pola łańcucha znaków używanego przez obiekty klasy CDocTempIate.
Pole Nazwa Przeznaczenie
0 CdocTemplate::windowTitle Tytuł (używany jedynie w programach SDI)
1 CdocTemplate::docName Nazwa nadawana nowemu dokumentowi (MFC dodaje do tej nazwy kolejny numer tworzonego dokumentu)
2 CdocTemplate::fileNewName Nazwa jaką MFC wyświetla w oknie dialogowym Nowy plik jeśli dostępny jest więcej niż jeden szablon dokumentu
3 CdocTemplate::filterName Nazwa rozszerzenia plików dokumentów tego typu
4 CdocTemplate::filterExt Rozszerzenie dokumentów tego typu (np. BLK)
5 CdocTemplate::regFileTypeId Wewnętrzna nazwa rejestru dokumentów tego typu
6 CdocTemplate::regFileTypeName Dostępna dla użytkownika nazwa tego typu dokumentów, umieszczana w rejestrze
Po raz kolejny mamy tu przykład dosyć nieszczęśliwego doboru nazwy. “Dokument" rozumiany w kontekście szablonu dokumentu, oznacza dokument w takim znaczeniu, w jakim myśli o nim użytkownik. Dla przykładu, mógłbyś posiadać osobny szablon dokumentu dla arkusza kalkulacyjnego, edytora lub terminala komunikacyjnego. Nie pomyl tego z obiektem dokumentu. Szablon dokumentu umożliwia stworzenie połączenia pomiędzy dokumentem, widokiem oraz ramką. Właśnie to połączenie jest najczęściej rozumiane przez użytkowników jako dokument.
Kreator App Wizard sam zadba o to, aby Twój program, w czasie wykonywania metody Initlnstance, inicjalizował na starcie szablon dokumentu. Następnie szablon ten umieszczany jest na liście szablonów programu za pomocą metody AddDocTemplate. Dla większości standardowych programów na tej liście umieszczany będzie tylko jeden szablon. Ze względu na to, wybór szablonu dokumentu, na którym należy działać, nie sprawia zazwyczaj żadnych problemów.
Jednak, istnieje możliwości zdefiniowania większej ilości szablonów. Jeśli dodasz nowy szablon do listy aplikacji, wszystko stanie się mniej proste i oczywiste. Jeśli będziesz próbował otworzyć nowy dokument, MFC spróbuje dopasować jego rozszerzenie do rozszerzenia podanego w łańcuchu zasobów. Jeśli użytkownik poprosi o stworzenie nowego pliku, MFC stworzy okno dialogowe zawierające nazwy wszystkich dostępnych szablonów dokumentów (nazwy te określane są za pomocą drugiego pola przedstawionego w tabeli 1.13). Dzięki temu użytkownik będzie mógł określić typ pliku, który chce stworzyć.
Dodatkowe szablony dokumentów
Nie ma żadnego powodu, dla którego musiałbyś dodawać szablony dokumentów do listy szablonów aplikacji, jeśli nie chcesz, aby były one uwzględniane podczas takich operacji jak tworzenie nowego pliku lub otwieranie pliku już istniejącego.