Чтобы создать дочернее окно 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, инициализируя переменные документа в его дополнительных данных и создавая дочернее окно поля редактирования текста.