Многооконный интерфейс
Во многих программах одновременно обрабатывается только один файл или документ. Интерфейс подобных приложений называется однооконным или однодокумент-ным (SDI — single-document interface). Примером SDI-приложения может служить ап-лет Windows Notepad (блокнот). Однако пользователям часто требуется просматривать несколько документов одновременно либо иметь возможность представления нескольких окон просмотра для одного документа. Интерфейс приложений, обеспечивающих такие возможности, называется многооконным или многодокументным (MDI — multiple-document interface).
MDI-приложение включает три типа окон. Главное окно называется MDI-фреймом (MDI frame window). Оно состоит из заголовка, рамки с изменяемыми размерами, системного меню, кнопки свертывания и других объектов, определяемых системой. MDI-приложение регистрирует класс окна и предоставляет процедуру для MDI-фрейма точно также, как это выполняется для обычного окна. Однако MDI-приложение не отображает вывод в клиентской области главного окна. Вместо этого оно создает клиентское окно, которое занимает клиентскую область главного окна. Клиентское окно принадлежит предварительно зарегистрированному классу MDI CLIENT. Упомянутое окно поддерживает создание и управление отдельными дочерними окнами, в которых отображается содержимое документа. Для MDI-приложения иногда необходимо отображение различных типов информации документа, поэтому оно может содержать различные типы дочерних окон. На рис. 27.1 показано простое MDI-приложение, которое содержит главное, клиентское и дочернее окна.
Создание MDI-приложения
Первый этап создания MDI-приложения заключается в регистрации оконных классов. Потребуется класс главного окна, а также классы всех типов дочерних окон, поддерживаемых приложением. Структура класса главного окна MDI подобна структуре главного окна SDI-приложения. Структура класса дочернего окна MDI подобна структурам классов дочерних окон SDI-приложений за двумя исключениями. Во-первых, структура класса дочернего окна MD1 должна указывать значок (ICON), поскольку пользователь может сворачивать это окно в пределах MDI-фрейма. Во-вторых, для имени меню должно быть установлено значение NULL, поскольку дочернее окно MDI не имеет собственного меню. В листинге 27.1 демонстрируется регистрация двух классов окна. Имя класса главного окна MDI — MyMDIApp, а дочернего — MDIChild.
Листинг 27.1 Регистрация классов окон MDI
__________________________________
См. \local-sources\chap27\t27-01.txt
После регистрации классов создается главное окно MDI, как и для SDI-приложения (см. листинг 27.2).
Листинг 27.2 Создание главного окна MDI
____________________
// Создание главного окна приложения.
hWnd = CreateWindow (lpszAppName, IpszTitle, WS_OVERLAPPEDWINDOW , CW_USEDEFAULT , 0, CW_USEDEFAULT , 0, NULL, NULL, hInstance, NULL ) ;
if ( !hWnd )
return ( FALSE ) ;
ShowWindow( hWnd, nCrodShow ) ; UpdateWindow ( hWnd ) ;
MDI-приложения должны вызывать функцию TranslateMDISysAccel в главном цикле сообщений для обработки предопределенных комбинаций клавиш сокращенного доступа, относящихся к MDI. Для MDI-приложений, имеющих таблицу комбинаций клавиш сокращенного доступа, перед вызовом TranslateAccelerator необходимо вызвать функцию TranslateMDISysAccel, чтобы позволить Windows обрабатывать все предопределенные клавиши сокращенного доступа MDI перед комбинациями, установленными для приложения. Поскольку данное тестовое приложение не имеет такой таблицы, вызывается только функция TranslateMDISysAccel, как показано в следующем фрагменте кода:
while( GetMessage( Smsg, NULL, 0, 0) )
{
if ( hWndClient && TranslateMDISysAccel( hHndClient, Smsg ) ) continue;
TranslateMessage( &msg ) ; DispatchMessage( Smsg ) ;
Когда главный цикл сообщений для приложения выполняется, процедура главного окна MDI должна координировать создание и управление отдельными дочерними окнами.
Главное окно MDI
Главное окно MDI отвечает за создание клиентского окна. Обычно это происходит во время обработки сообщения WM_CREATE. Клиентское окно MDI создается с помощью предварительно зарегистрированного класса MDICLIENT, как показано в листинге 27.3. Клиентское окно MDI динамически изменяет один из раскрывающихся пунктов строки меню главного окна. Поэтому необходимо передать дескриптор этого пункта в последнем параметре функции CreateWindowEx. Более подробные сведения об изменении клиентским окном пункта меню содержатся в разделе "Меню в MDI-при-ложениях" этой главы.
Листинг 27.3 Создание главного окна MDI
______________________________________________
См. \local-sources\chap27\t27-02.txt
При создании клиентского окна MDI доступен один дополнительный разряд стиля. Если MDI-клиент создается с разрядом стиля MDIS_ALLCHILDSTYLES, Windows не ограничивает допустимые значения разрядов стиля для дочерних окон. При создании окна клиента без установки разряда MDIS_ALLCHILDSTYLES могут указываться только значения, перечисленные в табл. 27.1. Использование разряда стиля MDIS_ALLCHILDSTYLES позволяет приложению создавать дочерние окна MDI с нестандартным поведением.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.