Создание дочернего окна MDI


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

Назад в оглавление
На главную страницу

Hosted by uCoz