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


После регистрации  классов окон, MDI приложение может создать свои окна. Сначала оно создает свое рамочное окно, используя функцию CreateWindow или CreateWindowEx.  После создания своего рамочного окна, приложение создает свое рабочее окно, снова  используя CreateWindow или CreateWindowEx. Приложение должно установить MDICLIENT как имя класса рабочего окна; MDICLIENT - заранее зарегистрированный класс окна, устанавливаемый системой. Параметр lpvParam  функции CreateWindow или CreateWindowEx должен указывать на структуру CLIENTCREATESTRUCT. Эта структура содержит члены, описанные в таблице  ниже:

Член структуры Описание
hWindowMenu Дескриптор меню окна, который  используется для того, чтобы управлять дочерними окнами MDI. По мере того как создаются дочерние окна, приложение добавляет их заголовки в меню окна как пункты меню. Пользователь может затем активизировать дочернее окно, щелкая по его заголовку в  меню окна.
idFirstChild Определяет идентификатор первого дочернего окна MDI. Первому созданному дочернее окно MDI присваивается этот идентификатор. Дополнительные окна создаются с идентификаторами окна, увеличенными на единицу . Когда дочернее окно разрушается, система немедленно переназначает  идентификаторы окна, чтобы сохранять их диапазон нумерации непрерывным.

Когда заголовок дочернего окна добавляется в меню окна, система назначает идентификатор дочернему окну. Когда пользователь щелкает по заголовку дочернего окна, рамочное окно получает сообщение WM_COMMAND с идентификатором в параметре wParam. Вам следует определить значение  члена структуры idFirstChild, не находится ли он в противоречии с идентификаторами пункта меню в меню рамочного окна(окна рамки).

Процедура рамочного окна приложения Multipad создает рабочее окно многодокументного интерфейса (MDI), в то время, когда обрабатывает сообщение WM_CREATE. Пример ниже показывает, как создается рабочее окно.

Демонстрационный пример

case WM_CREATE: 
    { 
        CLIENTCREATESTRUCT ccs; 
 
        // Извлекаем дескриптор меню окна назначаем 
        // идентификатор первому дочернему окну. 
 
        ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), WINDOWMENU); 
        ccs.idFirstChild = IDM_WINDOWCHILD; 
 
        // Создаем дочернее окно MDI. 
 
        hwndMDIClient = CreateWindow( "MDICLIENT", (LPCTSTR) NULL, 
            WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL, 
            0, 0, 0, 0, hwnd, (HMENU) 0xCAC, hInst, (LPSTR) &ccs); 
 
        ShowWindow(hwndMDIClient, SW_SHOW); 
    } 
    break; 

Заголовки дочерних окон добавляются в конец меню окна. Если приложение добавляет  строки к  меню окна, используя функцию AppendMenu, эти  строки могут быть переписаны в соответствии с заголовками дочерних окон, когда  меню окна перерисовывается (всякий раз, когда создается или разрушается дочернее окно). MDI приложение, которое добавляет  строки в свое меню окна, должно использовать функцию InsertMenu и проверять, что заголовки дочерних окон не переписали эти новые строки.

Используйте стиль WS_CLIPCHILDREN, чтобы создать рабочее окно MDI, которое препятствует окну закрашивать его дочерние окна.

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

Hosted by uCoz