Шаг 15.
Технология OLE. Интерфейс активации и редактирования по месту

    На этом шаге мы рассмотрим интерфейс активации и редактирования по месту.

    Процесс активации и редактирования по месту создаст мощный и в то же время дружественный пользователю интерфейс, который может значительно расширить сферу применения OLE-приложений. Неверное использование активации по месту может стать причиной серьезных ошибок, когда трудно (или даже невозможно) получить необходимые для завершения выполняемой задачи средства и информацию.


    Замечание. В сервере редактирования по месту используются немодальные диалоговые окна!

    При работе в OLE с объектом, редактируемым по месту, возможна ситуация, когда одно приложение, отображает модальный диалог, в то время как другое приложение отображает диалог немодальный.

    Для задания корректного образа действий в приложении, в котором необходимо отобразить модальный диалог, следует перед этим вызвать функцию EnableVodеlеss(FALSE). После завершения диалоговых операций следует обратиться к той же функции EnableVpdeless(TRUE). Объект вызывает функцию IOleInPlaceFrame::EnableVodeless(), контейнер же вызывает функцию IOleInPlaceActivateObject::EnabieVodeless().

    Редактирование по месту позволяет контейнеру воспользоваться пользовательским интерфейсом сервера, разрешив серверу заменить меню контейнера своим меню.

    Сначала, если это, возможно, следует воспользоваться AppExpert для создания OLE-приложения. С помощью AppExpert и классов OWL OLE можно автоматически создать большую часть функциональных возможностей редактирования по месту!

    Независимо от того, каким способом создается приложение OLE, неплохо ознакомиться с тем, как работает редактирование по месту, реализуемое шестью интерфейсами, несколькими структурами и рядом функций.

Интерфейсы редактирования по месту

    Существует ряд интерфейсов, используемых для поддержки редактирования по месту.

   
Таблица 1. Интерфейсы редактирования по месту
Интерфейс Описание
IOleWindow
Используется в приложениях и объекта, и контейнера. Интерфейс IOleWindow заключает в себе методы, используемые в приложениях, когда им необходимо получить дескрипторы различных окон, являющихся частью активации по месту. Дополнительно интерфейс IOleWindow используется для входа и выхода в режим контекстно-зависимой справки
IOleInPlaceObject
Используется в контейнерных приложениях, когда им необходимо активировать (и деактивировать) объект редактирования по месту. В вашем приложении можно получить указатель на интерфейс IOleInPlaceObject, обратившись к функции QueryInterface()
IOleInPlaceActiveObject
Используется для обеспечения коммуникации между объектами редактирования по месту и контейнерным приложением
IOleInPlaceUIWindow
Используется для установки ограниченной зоны окна документа или окна рамки
IOleInPlaceFarme
Используется для управления размещением составного меню, назначениями клавиш, поддержки контекстно-зависимой справки и управления немодальными диалоговыми окнами во время процесса редактирования по месту
IOleInPlaceSite
Используется для связи между контейнером и клиентной частью объекта сервера

Структуры редактирования по месту

    Существует три структуры, используемые для поддержки редактирования по месту.

   
Таблица 2. Структуры редактирования по месту.
Структура Описание
OLEINPLACEFRAVEINFO
Используется для передачи OLE нажатий назначенных клавиш контейнерному приложению во время редактирования по месту
OLEVENUGROUPWIDTHS
Используется для слежения за количеством меню во всех группах меню
BORDERWIDTH
Используется для запоминания значений, с помощью которых вычисляется ширина границ при редактировании объекта по месту. Эти границы могут использоваться для инструментальных управления или других нужд сервера

Функции редактирования по месту

    Существуют четыре дополнительные функции, используемые для поддержки редактирования по месту (таблица 3).

   
Таблица 3. Функции редактирования по месту
Функция Описание
OleCreateMenuDescriptor()
Создает и возвращает дескриптор для OLE, используемый при отправке команд и сообщений меню
OleDestroyMenuDescriptor()
Используется в контейнере для освобождения дескриптора совместно используемого меню, который выделялся с помощью обращения к функции OleCreateMenuDescriptor()
OleTranslateAccelerator()
Используется объектами приложений, чтобы контейнер мог транслировать свои назначенные клавиши, адресуемые параметром lpFramelnfo
IsAccelerator()
На самом деле не является функцией поддержки OLE, однако ее поле действия тесно связано с функцией OleTranslateAccelerator(), описанной выше. Она необходима в объектах приложений для вызова функции IsAccelerator(), чтобы определить, принадлежит ли приложению сообщение назначенной клавиши

    Эти функции используются для обеспечения связи между контейнером и сервером.

    Со следующего шага мы начнем рассматривать создание приложений OLE 2.




Предыдущий шаг Содержание Следующий шаг