Многооконный интерфейс. Создание MDI-приложения, страница 2

Таблица 27. 1 Значения параметра dwStyle функции CreateMDIWindow

Значение

Описание

WS_HSCROLL

Окно содержит горизонтальную полосу прокрутки.

WS_MAXIMIZE

Окно создано развернутым (во весь экран).

WS_MINIMIZE

Окно создано свернутым.

WS_VSCROLL

Окно содержит вертикальную полосу прокрутки.

Главное окно MDI также отвечает за создание и удаление отдельных дочерних окон. Дочернее окно создается с помощью функции CreateMDIWindow либо сообщения WM_MDICREATE. Обычно это выполняется в ответ на выбор пунктов меню, таких как File | Open (Файл | Открыть), File | New (Файл | Создать), File | Save (Файл | сохранить) и File | Close (Файл | Закрыть). Листинг 27.4 содержит пример из процедуры главного окна MDI, демонстрирующий создание дочернего окна в ответ на выбор пункта меню IDM_NEW.

Листинг 27.4 Создание нового дочернего окна MDI

______________________________________

См.     \local-sources\chap27\t27-03.txt

Во всех случаях, когда процедура главного окна не обрабатывает явно определенное сообщение, это сообщение должно передаваться функции DefFrameProc вместо функции DefWindowProc, как в обычной процедуре окна. Windows получает возможность реализовывать стандартное для MDI поведение.

Дочернее окно MDI

Обычно работа, еоторая выполняется в главном окне SDI-приложения, в MDI-при-ложении реализуется через дочерние окна. Процедура дочернего окна MD1 идентична аналогичной процедуре SDI за исключением стандартной обработки сообщений. Для описания необработанных сообщений окна дочернее окно MDI использует функцию DefMDIChildProc.

Главное отличие между окном SDI-приложения и дочерним окном MDI состоит в том, что SDI-приложение содержит только один экземпляр окна приложения, которое используется для управления одним набором данных. MDI-приложение обычно имеет несколько экземпляров дочернего окна, и все они воздействуют на различные наборы данных. Однако для всех экземпляров данного дочернего окна указывается только одна процедура. Это означает, что код процедуры дочернего окна MDI должен определять, для какого экземпляра данных предназначено текущее сообщение.

Процедура окна передается дескриптору дочернего окна MDI в его первом параметре. Для связи определенного набора данных с дескриптором окна можно воспользоваться одним из нескольких приемов.

Функция CreateMDIWindow и сообщение WM_MDICREATE позволяют создающей процедуре (обычно это процедура главного окна MD1) передавать 32-разрядное значение дочернему окну во время обработки сообщения WM_CREATE. Это значение должно содержать указатель на структуру данных, к которой дочернему окну необходим доступ. Затем дочернее окно может хранить этот указатель в одной из своих дополнительных областей данных. Выделять пространство для данных путем указания значения (которое представляет собой количество байт, необходимых для хранения указателя на структуру данных) члена cbWndExtra структуры WINDCLASS необходимо при регистрации класса окна. Затем для извлечения этого указателя дочернее окно MDI может использовать функцию GetWindowLong с необходимым преобразованием. Листинг 27.5 демонстрирует извлечение 32-разрядного значения дочерним окном в процессе обработки сообщения WM_CREATE.

Листинг 27.5 Извлечение 32-разрядного значения из сообщения WM_CREATE

______________

LRESULT ChildWndProc( HWND hWhdChild, UINT uMsg, WPARAM wParam, LPARRM IParam )

{

static LPARAM FrameParam;

switch( uMsg )

{              

case   WM_CREATE    :

{

LPCREATESTRUCT   IpCreateStruct   =    (LPCREATESTRUCT)IParam; LPMDICREATESTRUCT   IpMDICreateStruct   =

(LPMDICREATESTRUCT)lpCreateStruct->lpCreateParams;

FrameParam  =   lpMDICreateStruct->lParam;

}                                                                            

break;