Глава 26. Многодокументный интерфейс_________________________757

Закрытие дочернего окна MDI. Закрытие дочернего окна MDI по сравнению с открытием нового выглядит совсем просто. Функция simpleMDiciient::CmFileciose() выполняет закрытие в ответ на команду Файл, Закрыть (File, Close). Текст функции CmFileciose () приведен ниже:

void SimpleMDiciient::CmFileciose() (

// Активное дочернее MDI окно — то, которое будет закрыто

TMDIChild* child = GetActiveMDIChildO;

// Уничтожение интерфейса дочернего окна //и удаление соответствующего объекта ' child->Destroy() ;

delete child;

} ' • •_

Так как команда Файл, Закрыть (File, Close) всегда применяется только к активному дочернему окну, то функция CmFileciose () сначала получает указатель на активное дочернее окно через вызов функции GetActiveMDichild (), а затем использует этот указатель для закрытия окна.

Последние две строки функция CmFileciose о показывают, как надо закрывать дочернее окно. Первый шаг — вызов функции дочернего окна Destroy о . Она уничтожает интерфейс окна — подобно тому, как Create () его создает. Когда интерфейс уничтожен, удаляется сам объект (при этом предполагается, что он был создан динамическим выделением памяти).

Некорректно было бы разрешать доступ к командам меню, подобным Файл, Закрыть (File, Close) в том случае, если дочернего окна нет. Действительно, выполнение функции CmFileciose о при таких обстоятельствах может вызвать нарушение общей защиты (GPF, General Protection Fault). Чтобы избежать этого, класс simpleMDiciient перед выполнением команды Файл, Закрыть (File, Close) с помощью функции ceFiledoseO проверяет существование активного дочернего окна:

void SimpleMDiciient::CeFileClose(TCommandEnablers tee) <

// Разрешить только если есть активное дочернее MDI окно

tee.Enable(GetActiveMDichild() != NULL) ;

1

Эта простая функция разрешает выполнение команды только в том случае,

если вызов GetActiveMDIChildO возвращает значение, отличное от NULL.

I

Что осталось незамеченным

Мы заканчиваем рассмотрение текста программы SimpleMDI из листинга 26.1. Возможно, вы удивлены — а где же находится весь тот код, который обеспечивает выполнение рассмотренных нами команд меню Окно