770 ________________Часть V. Инструментарий программиста

В функции CmFileNewf) остался еще не рассмотренным всего один новый элемент. Последние несколько строк функции принимают указатель на приложение и используют его для установки члена FileData дочернего клиента эквивалентным члену FileData приложения. Тем самым гарантируется, что фильтр файлов, флаги и расширения по умолчанию в члене FileData клиента дочернего окна будут установлены должным образом.

Класс ResMDiciient вводит две функции, совместно обеспечивающие открытие файла. Функция CmFileOpenO обрабатывает сообщение CM_MDIFILEOPEN;

она выглядит так:

void ResMDIClient::CmFileOpenO (

ResTextApp *theApp = TYPESAFE_DOWNCAST(GetApplication(), ResTextApp) ;

// Визуализация стандартного окна диалога открытия файла // для выбора его имени

* (theApp->FileData.FileNaine) = 0; // Инициализация FileName if (TFileOpenDialog(this, theApp->FileData).Execute() == IDOK) OpenFile() ;

Эта функция открывает стандартное окно диалога открытия файла. Если пользователь выходит из окна диалога по нажатию кнопки ОК, то

CmFileOpen () вызывает ФУНКЦИЮ OpenFile ().

Функция OpenFile () выполняет основную работу по открытию файла. Если просмотреть текст функции OpenFile () в листинге 26.4, то можно увидеть, что она очень похожа на рассмотренную только что функцию cmFileNew(). Единственное действительно важное отличие заключается в том, что OpenFile () создает дочернего клиента TEditFile следующим образом:

TEditFile *childClient = new TEdi.tFile (0, О, О, О, О, О, О, theApp->FileData.FileName) ;

Здесь theApp->FileData. FileName — это имя, выбранное пользователем в окне диалога открытия файла. Таким образом, при создании дочернего клиента MDI содержимое файла заполняет клиентскую область дочернего окна.

Остановимся еще на одной особенности ResMDiciient. Функция cmFiiedoseO содержит строки:

if (!child->CanClose()) ' return;

перед строками закрытия дочернего окна. Эти строки дают гарантию, что дочернее окно не закроется прежде, чем пользователь сможет сохранить содержимое окна. Функция cancioset) дочернего окна вызывает функцию