Меню и ресурсы. Слияние меню
В этой статье описаны действия, необходимые для правильной обработки визуального редактирования и активации на месте для приложений ДОКУМЕНТОВ OLE. Активация на месте вызывает проблему как для приложений контейнера, так и для серверов (компонентов). Пользователь остается в том же окне фрейма (в контексте документа контейнера), но на самом деле выполняет другое приложение (сервер). Для этого требуется координация между ресурсами контейнеров и серверных приложений.
В этой статье рассматриваются следующие темы:
Макеты меню
Первым шагом является координата макетов меню. Приложения-контейнеры должны создавать новое меню, которое будет использоваться только при активации внедренных элементов. По крайней мере, это меню должно состоять из следующих элементов в указанном порядке:
Меню файлов идентично тому, которое используется при открытии файлов. (Обычно другие элементы меню не помещаются перед следующим элементом.)
Два последовательных разделителя.
Меню окна идентично тому, которое используется при открытии файлов (только если приложение контейнера в приложении MDI). В некоторых приложениях могут быть другие меню, такие как меню "Параметры", принадлежащие этой группе, которая остается в меню при активации внедренного элемента.
Примечание.
Могут быть другие меню, влияющие на представление документа контейнера, например Zoom. Эти меню контейнеров отображаются между двумя разделителями в этом ресурсе меню.
Приложения сервера (компонента) также должны создавать новое меню специально для активации на месте. Это должно быть похоже на меню, используемое при открытии файлов, но без элементов меню, таких как файл и окно, которые управляют документом сервера вместо данных. Обычно это меню состоит из следующих элементов:
Меню редактирования идентично тому, которое используется при открытии файлов.
Разделитель.
Меню редактирования объектов, например меню пера в примере приложения Scribble.
Разделитель.
Меню справки.
Например, просмотрите макет некоторых примеров меню на месте для контейнера и сервера. Сведения о каждом элементе меню были удалены, чтобы сделать пример более понятным. В меню контейнера есть следующие записи:
IDR_CONTAINERTYPE_CNTR_IP MENU PRELOAD DISCARDABLE
BEGIN
POPUP "&File C1"
MENUITEM SEPARATOR
POPUP "&Zoom C2"
MENUITEM SEPARATOR
POPUP "&Options C3"
POPUP "&Window C3"
END
Последовательные разделители указывают, где должна идти первая часть меню сервера. Теперь просмотрите меню сервера на месте:
IDR_SERVERTYPE_SRVR_IP MENU PRELOAD DISCARDABLE
BEGIN
POPUP "&Edit S1"
MENUITEM SEPARATOR
POPUP "&Format S2"
MENUITEM SEPARATOR
POPUP "&Help S3"
END
Разделители здесь указывают, где должна идти вторая группа элементов меню контейнера. Результирующая структура меню при активации объекта с этого сервера в этом контейнере выглядит следующим образом:
BEGIN
POPUP "&File C1"
POPUP "&Edit S1"
POPUP "&Zoom C2"
POPUP "&Format S2"
POPUP "&Options C3
POPUP "&Window C3"
POPUP "&Help S3"
END
Как видно, разделители были заменены различными группами меню каждого приложения.
Таблицы акселератора, связанные с меню на месте, также должны быть предоставлены серверным приложением. Контейнер будет включать их в собственные таблицы акселераторов.
При активации внедренного элемента платформа загружает меню на месте. Затем он запрашивает серверное приложение для его меню активации на месте и вставляет его, где находятся разделители. Вот как объединяются меню. Вы получаете меню из контейнера для работы с файлом и размещением окна, и вы получаете меню с сервера для работы с элементом.
Панели инструментов и панели состояния
Серверные приложения должны создать новую панель инструментов и сохранить его растровое изображение в отдельном файле. Созданные мастером приложения хранят эту растровую карту в файле ITOOLBAR.BMP. Новая панель инструментов заменяет панель инструментов приложения контейнера при активации элемента сервера и должна содержать те же элементы, что и обычная панель инструментов, но удалять значки, представляющие элементы в меню "Файл" и "Окно".
Эта панель инструментов загружается в COleIPFrameWnd
производном классе, созданном мастером приложений. Строка состояния обрабатывается приложением контейнера. Дополнительные сведения о реализации окон кадров на месте см. в разделе "Серверы: реализация сервера".