Чтобы создать дочернее окно MDI, приложение может или вызвать функцию CreateMDIWindow или отправить сообщение WM_MDICREATE рабочему окну MDI. (Приложение может использовать функцию CreateWindowEx со стилем WS_EX_MDICHILD, чтобы создать дочерние окна MDI). Однопоточное MDI приложение может использовать любой метод, чтобы создать дочернее окно. Поток в многопоточном MDI приложении должен использовать функцию CreateMDIWindow или CreateWindowEx, чтобы создать дочернее окно в другом потоке.
Параметр lParam сообщения WM_MDICREATE - это дальний указатель на структуру MDICREATESTRUCT. Структура включает в себя четыре члена размера: x и y, которые обозначают горизонтальную и вертикальную позиции окна, и cx и cy, которые обозначают горизонтальную и вертикальную протяженности окна. Любой из из этих членов может быть явно назначен приложением, или они могут устанавливаться в CW_USEDEFAULT, в этом случае система выбирает позицию, размер, или оба параметра, согласно алгоритму каскадного размещения. В любом случае, все четыре члена должны быть инициализированы. Программа Multipad использует для всех этих размеров флажок CW_USEDEFAULT.
Последний член структуры MDICREATESTRUCT является членом стиля, который может содержать биты стиля для окна. Чтобы создать дочернее окно MDI, которое может иметь любую комбинацию стилей окна, устанавливается стиль MDIS_ALLCHILDSTYLES. Когда этот стиль не определен, дочернее окно MDI имеет WS_MINIMIZE, WS_MAXIMIZE, WS_HSCROLL и WS_VSCROLL стили как заданные по умолчанию назначения.
Multipad создает свои дочерние окна MDI, используя свою локально определяемую функцию AddFile (расположенную в исходном файле MPFILE.C). Функция AddFile устанавливает заголовок дочернего окна, присваивая члену szTitle структуры MDICREATESTRUCT или имя редактируемого файла или "Untitled" (Неназванный). В члене szClass структуры устанавливается имя класса дочернего окна MDI, зарегистрированного в функции InitializeApplication программы Multipad. В члене hOwner структуры устанавливается дескриптор экземпляра приложения.
Пример ниже демонстрирует функцию AddFile в Multipad.
Демонстрационный пример
HWND APIENTRY AddFile(pName) TCHAR * pName; { HWND hwnd; TCHAR sz[160]; MDICREATESTRUCT mcs; if (!pName) { // Если параметр pName равен NULL, загружается строка // "Untitled" из ресурса STRINGTABLE, а член szTitle // устанавливается в MDICREATESTRUCT. LoadString(hInst, IDS_UNTITLED, sz, sizeof(sz)/sizeof(TCHAR)); mcs.szTitle = (LPCTSTR) sz; } else // Заголовок окна с полным путем и именем файла, // полученный при помощи функции OpenFile с флажком // OF_PARSE, которая вызывается перед AddFile(). mcs.szTitle = of.szPathName; mcs.szClass = szChild; mcs.hOwner = hInst; // Размеры дочернего окна используются по умолчанию. mcs.x = mcs.cx = CW_USEDEFAULT; mcs.y = mcs.cy = CW_USEDEFAULT; // Придадим дочернему окну стиль по умолчанию. // Переменная styleDefault определяется в MULTIPAD.C. mcs.style = styleDefault; // Предпишем рабочему окну MDI создать дочернее окно. hwnd = (HWND) SendMessage (hwndMDIClient, WM_MDICREATE, 0, (LONG) (LPMDICREATESTRUCT) &mcs); // Если файл найден, прочитаем его содержание в рабочей // области дочернего окна. if (pName) { if (!LoadFile(hwnd, pName)) { // Не может загрузить файл; закрываем окно. SendMessage(hwndMDIClient, WM_MDIDESTROY, (DWORD) hwnd, 0L); } } return hwnd; } |
Указатель, передаваемый в параметре lParam сообщения WM_MDICREATE переправляется в функцию CreateWindow и показывается как первый член в структуре CREATESTRUCT, передаваемой в сообщении WM_CREATE. В Multipad дочернее окно инициализирует себя в ходе обработки сообщений WM_CREATE, инициализируя переменные документа в его дополнительных данных и создавая дочернее окно поля редактирования текста.