Zgłębianie indiańskiej duszy jest jak nurkowanie w kowadle – najczęściej boli od tego głowa.
3 CMultiDocTemplate* pDocTemplate;
4 pDocTemplate = new CMultiDocTemplate( O
5 IDR_MDICOITYPE,
6 RUNTIME_CLASS(CMDICoinDoc),
7 RUNTIME_CLASS(CChildFrame),
8 RUNTIME_CLASS(CMDICoinView)) ;
9 AddDocTemplate(pDocTemplate); @
10
11 // Utwórz główne okno obramowujące MDI
12 CMainFrame* pMainFrame = new CMainFrame; ®
13 if (!pMainFrame->LoadFrame(IDR__MAINFRAME))
14 return FALSE; O
15 m_pMainWnd = pMainFrame;
O Tworzymy egzemplarz szablonu wielodokumentowego i przesyłamy identyfikator zasobów i bieżące
klasy (czasu wykonania) jego dokumentu, widoku i okna obramowującego.
@ Rejestrujemy nowo utworzony szablon dokumentu wraz z klasą aplikacji.
Aplikacje wielodokumentowe 543
© Tworzymy egzemplarz okna obramowującego aplikacji.
O Informujemy główne okno obramowujące, który z kompletów zasobów (takich jak menu czy pasek
narzędziowy) załadować.
Podczas tworzenia obiektu CMultiDocTemplate (linia 4) przesyłane są mu cztery parametry.
Pierwszy parametr to identyfikator zasobów IDR_MDICOITYPE (linia 5). Identyfikator ten opisuje trzy
różne zasoby związane z dokumentem SMDicoinDoc: ikonę, menu i tablicę łańcuchów. Trzy kolejne
parametry są wskaźnikami do informacji czasu wykonania na temat klas dokumentu, okna
obramowującego i widoku (pojawiają się odpowiednio w liniach 6, 7 i 8). Do tworzenia tych
wskaźników wykorzystywana jest makroinstrukcja RUNTIME_CLASS. Dynamiczne tworzenie tych klas
jest możliwe dzięki temu, że kreator AppWizard dołączył do programu obsługujące dynamiczną kreację
makroinstrukcje:
DECLARE_DYNCREATE i IMPLEMENT_DYNCREATE.
Pomiędzy szablonami dokumentów w aplikacjach SDI i MDI jest kilka istotnych różnic. Obie
klasy CSingleDocTemplate i CMultiDocTemplate wywodzą się z tej samej klasy bazowej
CDocTemplate. Jednak podczas gdy klasa CSingleDocTemplate obsługuje tylko jeden obiekt
dokumentu, klasa CMultidocTemplate obsługuje listę wskaźników do dokumentów (tutaj obiektów
CMDlCoinDoc).
Obiekty dokumentu, widoku i okna obramowującego nie są jeszcze w tym momencie tworzone.
Przedstawiony fragment kodu inicjalizuje obiekt CMultiDocTemplate, zapełniając go informacjami
potrzebnymi do załadowania zasobów oraz alokowania na żądanie w pamięci dokumentów, widoków i
okien obramowujących.
Klasa aplikacji przechowuje listę szablonów dokumentów. Przyzywana w linii 9 funkcja
AddDocTemplate dodaje do tej listy nowy obiekt. Funkcję tę wzywamy za każdym razem, gdy chcemy
zarejestrować nowe szablony dokumentów. W ten sposób pojedyncza aplikacja może obsługiwać różne
rodzaje powiązań między dokumentem, widokiem a oknem obramowującym.
Okno dialogowe New Document
Jeśli w klasie aplikacji zarejestrowany jest więcej niż jeden typ dokumentu, wybranie w menu File
polecenia New wywoła okno dialogowe pytające jakiego rodzaju dokument chcemy otworzyć. Opis
wyświetlony w oknie zaczerpnięty jest z odpowiedniego dla tego dokumentu (z właściwym mu
identyfikatorem IDR_) pola tablicy łańcuchów.
Klasa CWinApp podtrzymuje obiekt CMultiDocTemplate, dopóki sama nie zostanie zniszczona,
czyli dopóki aplikacja nie zostanie wyłączona. Podczas niszczenia klasy cwi-nApp pamięć oczyszczana
jest z szablonów dokumentu, o ile oczywiście zostały one doda-
544_____________________________________Poznaj Visual C++ 6
ne za pomocą funkcji AddDocTemplate. Szablony dokumentów zajmują bardzo niewiele pamięci,
dlatego przechowywanie ich przez cały czas życia aplikacji nie jest dużym obciążeniem dla systemu.
W linii 12 za pomocą konstruktora CMainFrame tworzone jest główne okno obramo-wujące.
Funkcja LoadFrame przyzywana w linii 13 wykorzystuje jako parametr identyfikator zasobów i podłącza
do okna obramowującego zasoby IDR_MAINFRAME. Funkcji LoadFrame można również opcjonalnie
przesłać parametr definiujący znaczniki stylów okna. Domyślne style to FWS_ADDTOTITLE i
WS_OVERLAPPEDWINDOW. Styl OVERLAPPED-WINDOW łączy w sobie style podane w tabeli 21.1. Znacznik
FWS_ADDTOTITLE jest specyficzny dla biblioteki MFC i sprawia, że nazwa aktywnego dokumentu jest
wyświetlana na pasku tytułowym. Normalnie na pasku tytułowym wyświetlana jest najpierw nazwa apli-
kacji, a po niej nazwa aktywnego dokumentu. Porządek ten można odwrócić za pomocą znacznika
FWS_PREFIXTITLE.
Tabela 21.1