Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

3.20. «Чужая» панель

Следует упомянуть об относительно новой в KOL возможности создавать панель, в качестве родителя для которой может быть указано произвольное окно, в том числе окно чужого приложения. Например, таким окном может быть панель задач Windows. Для создания «чужой» панели используется конструктор:

AP := NewAlienPanel( ParentWnd, edgeStyle);

“Чужая” панель действует так же, как и обычная, но родитель ее задается не в виде указателя объекта типа PControl, а в виде дескриптора окна. Никаких других особенностей нет. Следует только помнить, что в случае разрушения родительского окна «чужая» панель так же будет разрушена.

В MCK для самой чужой панели нет зеркала, т.к. конструировать ее требуется своим кодом. Но для наполнения «чужой» панели содержимым можно использовать механизм фреймов, описанный двумя параграфами выше – если для проектирования используется MCK.

3.21. MDI-интерфейс

В заключение раздела, рассмотрим отдельно создание MDI-приложений. Многодокументный интерфейс может быть построен либо вручную, либо с использованием MCK. Но в любом случае, в опции проекта следует добавить символ условной компиляции USE_MDI*. При ручном кодировании, во-первых, следует создать клиентское окно, дочернее по отношению к форме. Обычная практика при разработке MDI-интерфейса – это использование всего пространства формы, кроме главного меню, линейки инструментов (при ее наличии) и строки состояния (так же опциональной) для клиентской области. Но не возбраняется и размещение других визуальных элементов, например, по бокам от клиентской области. Создание клиента выполняется вызовом функции

NewMDIClient( ParentForm, WindowMenuHandle )

Обратите внимание на параметр WindowMenuHandle. Это дескриптор подменю, в котором система будет автоматически добавлять названия дочерних MDI-окон. Если в качестве этого параметра указать 0, но названия окон добавляться не будут. Если такая возможность желательна, то следует предварительно создать главное меню, а затем передать дескриптор нужного подменю в качестве второго параметра. Например, так:

var MainMenu: PMenu;

MainForm, MDI_Client: PControl;

MainMenu := NewMenu( MainForm, 0, [

'New', '(', 'Create MDI Child', ')',

'Window', '(', 'Tile', 'Cascade', ')', '' ],

TOnMenuItem(MakeMethod(nil, @MenuItems)) );

MDI_Client := NewMDIClient( MainForm,

GetSubMenu( MainMenu, 1 ) );

Для создания дочерних MDI-окон следует использовать функцию

NewMDIChild( ParentMDIClient, 'MDIChildName' );

Таких окон может быть несколько, создаваться они могут динамически, что вполне обычно для MDI-интерфейса. На таком дочернем окне могут располагаться произвольные визуальные элементы, как на обычной панели. При разработке дочерних окон следует учесть, что размеры их могут изменяться, в частности, окно может быть максимизировано по клиентскому окну.

Визуальная разработка MDI-интерфейса с использованием MCK так же возможна. Для чего имеются зеркальные классы TKOLMDIClient и TKOLMDIChild. Вполне вероятно, что пригодится только первый из них, тогда как дочерние окна придется создавать все-таки динамически. Для упрощения создания рекомендуется использовать TKOLFrame, на котором в режиме разработки размещаются необходимые визуальные объекты, а во время исполнения полученная совокупность объектов просто клонируется вызовом соответствующей функции.

Следует отметить себе, что некоторые операции с MDI-окнами выполняются несколько иным способом, чем с обычными визуальными объектами. Например, для программной максимизации некоторого клиентского окна предпочтительно использовать отправку сообщения WM_MDIMAXIMIZE клиентскому окну, хотя можно отправить и сообщение WM_SYSCOMMAND с wParam = SC_MAXIMIZE самому дочернему окну.