Взаимодействие представлений документа
Существует и второй способ – непосредственно использовать глобально определенный объект 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 выделяет подстроку комплексной строки, и по ее содержимому мы узнаем выбор пользователя.
