Интерфейс IOleCommandTarget позволяет объектов и их контейнеров для отправки команды друг к другу. Например объект панели инструментов могут содержать кнопки для выполнения команд, таких как Печать, Предварительный просмотр, Сохранение, Ньюи увеличить. Если такой объект были внедрены в контейнере, который поддерживает IOleCommandTarget, объект может позволить ее кнопок и перенаправлять команды к контейнеру для обработки, когда пользователь щелкает им. Если контейнер внедренный объект для печати сам, он может внести этот запрос, отправляя команды через IOleCommandTarget интерфейс внедренного объекта.
IOleCommandTarget — интерфейс автоматизации как в том, что он используется клиентом для вызова методов на сервере. Однако используя IOleCommandTarget сохраняет накладные расходы междугородних звонков через интерфейсы автоматизации, потому что программистам не нужно использовать обычно дорогих метод Invoke IDispatch.
В MFC IOleCommandTarget интерфейс используется активный документ серверами для обеспечения активного документа контейнеров для отправки команды на сервере. Активного документа сервера класса, CDocObjectServerItem, использует MFC интерфейса карты (см. TN038: осуществление IUnknown MFC/OLE) для реализации интерфейса IOleCommandTarget.
IOleCommandTarget также реализованы в классе COleFrameHook . COleFrameHook — без документов класс MFC, реализующий функции фрейма окна редактирования контейнеров на месте. COleFrameHook также использует схемы интерфейса MFC для реализации интерфейса IOleCommandTarget . COleFrameHookосуществление IOleCommandTarget направляет команды OLE COleDocObjectItem-производных контейнеров активного документа. Это позволяет любой активный MFC контейнер документа принимать сообщения от серверов содержит активного документа.
MFC OLE команды карты
MFC разработчики могут использовать IOleCommandTarget с помощью MFC OLE команды карт. OLE команды карты, как сообщение карт потому, что они могут использоваться для отображения команды OLE для функций-членов класса, содержащего команду карта. Чтобы сделать эту работу, место макросы в команду карте для указания группы команд OLE требуется обрабатывать команды, команды OLE и Идентификатор команды сообщения WM_COMMAND , которые будут отправлены при получении команды OLE. MFC предоставляет несколько предопределенных макросов для стандартных команд OLE. Для списка стандартных OLE команды, которые первоначально предназначались для использования с приложениями Microsoft Office, в перечислении OLECMDID, который определен в docobj.h.
Когда Команда OLE получает приложение MFC, содержащее карта команды OLE, MFC пытается найти Идентификатор команды и группы команд для запрошенной команды на карте команды OLE приложения. Если соответствие найдено, приложения, содержащего команду Карта с Идентификатором запрошенную команду отправки сообщения WM_COMMAND . (См. Описание ON_OLECMD ниже.) Таким образом команды OLE, направил в приложение включены в сообщения WM_COMMAND MFC. Сообщения WM_COMMAND , затем направляются через схемы сообщений приложения с помощью MFC стандарта Маршрутизация команд архитектура.
В отличие от схемы сообщений MFC OLE команды карты не поддерживаются ClassWizard. MFC разработчики должны добавить OLE команды карта поддержки и записей карты OLE команды вручную. OLE команда карты могут быть добавлены к MFC активных серверов документа в любом классе, в цепи маршрутизации сообщений WM_COMMAND во время активный документ активен на месте в контейнере. Эти классы включают приложения классы, производные от класса CWinApp, CView, CDocumentи COleIPFrameWnd. В активном документе контейнерах, OLE команды карты могут быть добавлены только к COleDocObjectItem-производного класса. Кроме того, в контейнерах активного документа, сообщения WM_COMMAND только в будут направлены схеме сообщений в COleDocObjectItem-производного класса.
OLE команды Map макросов
Использовать следующие макросы для добавления функций карта команды в класс:
DECLARE_OLECMD_MAP)
Этот макрос идет в объявлении класса (обычно в заголовочном файле) класса, содержащего команду Карта.
BEGIN_OLECMD_MAP (theClass, baseClass)
theClass
Имя класса, содержащего команду Карта.
baseClass
Имя класса базового класса, содержащего команду Карта.
Этот макрос знаменует начало команды карты. Использовать этот макрос в файле реализации для класса, содержащего команду Карта.
END_OLECMD_MAP()
Этот макрос знаменует окончание команды карты. Используйте этот макрос в файле реализации для класса, содержащего команду карта. Этот макрос необходимо всегда следовать BEGIN_OLECMD_MAP макрос.
ON_OLECMD (pguid, olecmdid, id)
pguid
Указатель GUID группы команд команды OLE. Этот параметр имеет значение NULL для стандартной группы команд OLE.
olecmdid
OLE команды Идентификатор команды вызова.
id
Идентификатор сообщения WM_COMMAND , чтобы отправить приложению, содержащий карты команды при вызове этой команды OLE.
Использование ON_OLECMD макрос в карте команды для добавления записи для OLE команды для обработки. При получении команды OLE, они будут преобразованы в указанного сообщения WM_COMMAND и через схемы сообщений приложения с использованием стандартной архитектуры Маршрутизация команд MFC.
Пример
Следующий пример показывает, как добавить возможность обработка команды OLE для MFC активного документа сервера для обработки OLECMDID_PRINT OLE команды. В этом примере предполагается, что вы использовали AppWizard для создания приложения MFC, которое представляет собой сервер активных документов.
DECLARE_OLECMD_MAP макрос для объявления класса.Примечаниеnbsp; Используйте CView-производного класса, потому что это один из классов в активном документе сервер, находящийся в цепи маршрутизации сообщений WM_COMMA&ND.
класс CMyServerView: государственные CView
{
защита: / / create от сериализации только
CMyServerView();
DECLARE_DYNCREATE(CMyServerView)
DECLARE_OLECMD_MAP()
. . .
}
BEGIN_OLECMD_MAP и END_OLECMD_MAP макросы:BEGIN_OLECMD_MAP (CMyServerView, CView)
END_OLECMD_MAP()
BEGIN_OLECMD_MAP (CMyServerView, CView)
ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
END_OLECMD_MAP()
Обратите внимание, что один из стандартной команды макросов OLE, определенный в afxdocob.h, могут использоваться в вместо макрос ON_OLECMD потому что OLECMDID_PRINT является стандартный идентификатор команды OLE ON_OLECMD_PRINT макрос выполнить ту же задачу, как макрос ON_OLECMD , показано выше.
Когда приложение контейнера отправляет этот сервер OLECMDID_PRINT команду через интерфейс сервера IOleCommandTarget , обработчик печати команд MFC будет вызван на сервере, вызывая на сервере печати приложения. Код контейнера активных документов для вызова команда print, добавлена в предыдущих шагах будет выглядеть примерно следующим образом:
void CContainerCntrItem::DoOleCmd()
{
IOleCommandTarget * pCmd = NULL;
HRESULT hr = E_FAIL;
OLECMD ocm = {OLECMDID_PRINT, 0};
HR = m_lpObject-gt;QueryInterface (IID_IOleCommandTarget, reinterpret_cast < Пробел ** >(&pCmd));
if(Failed(HR))
возвращение;
HR = pCmd - > QueryStatus (NULL, 1 & ocm, NULL);
if(Succeeded(HR) & & (ocm.cmdf и OLECMDF_ENABLED))
{
//Command доступны и включены так называют его
COleVariant вин;
COleVariant vOut;
HR = pCmd - > Exec (NULL, OLECMDID_PRINT,
OLECMDEXECOPT_DODEFAULT, vIn & vOut);
Assert(Succeeded(HR));
}
pCmd - > Release();
}
Технические примечания по номеру |nbsp; Технические примечания по категориям