На этом шаге мы рассмотрим интерфейс активации и редактирования по месту.
Процесс активации и редактирования по месту создаст мощный и в то же время дружественный пользователю интерфейс, который может значительно расширить сферу применения OLE-приложений. Неверное использование активации по месту может стать причиной серьезных ошибок, когда трудно (или даже невозможно) получить необходимые для завершения выполняемой задачи средства и информацию.
При работе в OLE с объектом, редактируемым по месту, возможна ситуация, когда одно приложение, отображает модальный диалог, в то время как другое приложение отображает диалог немодальный.
Для задания корректного образа действий в приложении, в котором необходимо отобразить модальный диалог, следует перед этим вызвать функцию EnableVodеlеss(FALSE). После завершения диалоговых операций следует обратиться к той же функции EnableVpdeless(TRUE). Объект вызывает функцию IOleInPlaceFrame::EnableVodeless(), контейнер же вызывает функцию IOleInPlaceActivateObject::EnabieVodeless().
Редактирование по месту позволяет контейнеру воспользоваться пользовательским интерфейсом сервера, разрешив серверу заменить меню контейнера своим меню.
Сначала, если это, возможно, следует воспользоваться AppExpert для создания OLE-приложения. С помощью AppExpert и классов OWL OLE можно автоматически создать большую часть функциональных возможностей редактирования по месту!
Независимо от того, каким способом создается приложение OLE, неплохо ознакомиться с тем, как работает редактирование по месту, реализуемое шестью интерфейсами, несколькими структурами и рядом функций.
Существует ряд интерфейсов, используемых для поддержки редактирования по месту.
Интерфейс | Описание |
---|---|
Используется в приложениях и объекта, и контейнера. Интерфейс IOleWindow заключает в себе методы, используемые в приложениях, когда им необходимо получить дескрипторы различных окон, являющихся частью активации по месту. Дополнительно интерфейс IOleWindow используется для входа и выхода в режим контекстно-зависимой справки | |
Используется в контейнерных приложениях, когда им необходимо активировать (и деактивировать) объект редактирования по месту. В вашем приложении можно получить указатель на интерфейс IOleInPlaceObject, обратившись к функции QueryInterface() | |
Используется для обеспечения коммуникации между объектами редактирования по месту и контейнерным приложением | |
Используется для установки ограниченной зоны окна документа или окна рамки | |
Используется для управления размещением составного меню, назначениями клавиш, поддержки контекстно-зависимой справки и управления немодальными диалоговыми окнами во время процесса редактирования по месту | |
Используется для связи между контейнером и клиентной частью объекта сервера |
Существует три структуры, используемые для поддержки редактирования по месту.
Структура | Описание |
---|---|
Используется для передачи OLE нажатий назначенных клавиш контейнерному приложению во время редактирования по месту | |
Используется для слежения за количеством меню во всех группах меню | |
Используется для запоминания значений, с помощью которых вычисляется ширина границ при редактировании объекта по месту. Эти границы могут использоваться для инструментальных управления или других нужд сервера |
Существуют четыре дополнительные функции, используемые для поддержки редактирования по месту (таблица 3).
Функция | Описание |
---|---|
Создает и возвращает дескриптор для OLE, используемый при отправке команд и сообщений меню | |
Используется в контейнере для освобождения дескриптора совместно используемого меню, который выделялся с помощью обращения к функции OleCreateMenuDescriptor() | |
Используется объектами приложений, чтобы контейнер мог транслировать свои назначенные клавиши, адресуемые параметром lpFramelnfo | |
На самом деле не является функцией поддержки OLE, однако ее поле действия тесно связано с функцией OleTranslateAccelerator(), описанной выше. Она необходима в объектах приложений для вызова функции IsAccelerator(), чтобы определить, принадлежит ли приложению сообщение назначенной клавиши |
Эти функции используются для обеспечения связи между контейнером и сервером.
Со следующего шага мы начнем рассматривать создание приложений OLE 2.