Взаимодействие представлений документа
Существует и второй способ – непосредственно использовать глобально определенный объект theApp, но для этого необходимо в начало срр-файла, где предполагается его использовать, поместить строку, разрешающую проблему видимости объекта theApp:
extern СТгееАрр theApp; // Определен в другом месте
В файл реализации класса CTreeDoc вставьте тело функции MakeView, которое приведено ниже. В ней реализован доступ к приложению с помощью глобальной функции AfxGetApp, но вы можете опробовать и второй способ, заменив "рАрр › " на " theApp. " и учтя сказанное выше. При этом также отпадает необходимость в строке кода:
СТrееАрр* рАрр = (СТrееАрр*) Af xGetApp ();.
bool CTreeDoc::MakeView() { //==== Если недостает какого-либо из представлений if (!m_bDrawExist ||!m_bTreeExist) { //====== Добываем адрес приложения CTreeApp* pApp = (CTreeApp*) AfxGetApp (); CDocTemplate *pTempl; // ====== Выбираем шаблон недостающего типа if (!m_bDrawExist) { pTempl = pApp › m_pTemplDraw; m_bDrawExist = true; } else { pTempl = pApp › m_pTemplTree; m_bTreeExist = true; // Создаем окно документа // Тип рамки и представления определяется шаблоном CFrameWnd *pFrarae = pTempl › CreateNewFrame (this, 0); pTempl › InitialUpdateFrame (pFrarae, this); return true; } return false; }
Если вы хотите иметь современный и чуть более надежный код, то используйте вызов:
CTreeApp* pApp = dynamic_cast<CTreeApp*> (AfxGetApp ());
Всю работу по созданию окна-рамки и помещения в его клиентскую область выполняют методы CreateNewFrame и InitialUpdateFrame класса CDocTemplate, который является базовым для класса CMultiDocTemplate. Вы помните, что два объекта последнего класса мы создали в теле функции initlnstance для реализации MDI-функциональности по нашему сценарию. Сценарий еще пока не реализован. Введем изменения в метод OnNewDocument, для того чтобы правильно установить флаги существования окон:
BOOL CTreeDoc:: OnNewDocument () { //====== При создании нового документа if (ICDocument:: OnNewDocument ()) return FALSE; //====== Документ знает свой шаблон CDocTemplate* pTempl = GetDocTemplate (); CString s; //====== Выясняем его тип из строкового ресурса pTempl › GetDocStrlng (s, CDocTemplate:: fileNewName); m_bDrawExist – s == "Draw"; m_bTreeExist =!m_bDrawExist; return TRUE; }
При создании нового документа пользователь выбирает один из двух шаблонов (Tree, Draw), предложенных ему в диалоге New, который, как вы помните, поддерживает каркас приложения. Наша задача – выяснить выбор, сделанный пользователем. Это можно сделать с помощью одного из членов квартета, а именно строкового ресурса, связанного с каждым из шаблонов. Метод GetDocString выделяет подстроку комплексной строки, и по ее содержимому мы узнаем выбор пользователя.