Иллюстрированный самоучитель по Visual Studio .NET

Взаимодействие представлений документа

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.