La interfaz IOleCommandTarget permite a los objetos y sus contenedores para enviar comandos mutuamente. Por ejemplo, barras de herramientas de un objeto pueden contener botones de comandos, como Imprimir, Vista preliminar, Guardar, Nuevay Zoom. Si tal objeto estaban incorporado en un contenedor que admite IOleCommandTarget, el objeto podría habilitar sus botones y reenviar los comandos para el contenedor de procesamiento cuando el usuario hace clic en les. Si un contenedor quería el objeto incrustado para imprimir sí, podría hacer esta solicitud mediante el envío de un comando a través de la interfaz IOleCommandTarget del objeto incrustado.
IOleCommandTarget es una interfaz de automatización que es utilizado por un cliente para invocar métodos en un servidor. Sin embargo, usando IOleCommandTarget guarda la sobrecarga de llamadas mediante las interfaces de automatización porque los programadores no tienen que utilizar el método Invoke normalmente caro de IDispatch.
En MFC, la interfaz IOleCommandTarget es utilizada por servidores de documentos activos para permitir contenedores de documento activo enviar comandos al servidor. La clase de servidor del documento activo, CDocObjectServerItem, utiliza mapas de interfaz MFC (véase TN038: aplicación de IUnknown MFC/OLE) para implementar la interfaz IOleCommandTarget.
IOleCommandTarget también está implementado en la clase COleFrameHook . COleFrameHook es una clase MFC indocumentada que implementa la funcionalidad de ventana de marco de contenedores de edición en el lugar. COleFrameHook también utiliza mapas de interfaz MFC para implementar la interfaz IOleCommandTarget . Aplicación de COleFrameHookde IOleCommandTarget envía comandos OLE a COleDocObjectItem-derivados contenedores del documento activo. Esto permite que cualquier contenedor de documentos activos de MFC recibir mensajes de servidores de documentos activos contenidos.
Mapas de comando OLE de MFC
MFC los desarrolladores pueden aprovechar de IOleCommandTarget mediante el uso de mapas de comando MFC OLE. OLE mapas de comando son como mensaje mapas porque puede utilizarse para asignar comandos OLE a funciones de miembro de la clase que contiene el mapa de comando. Para hacer este trabajo, coloque las macros en el mapa de comando para especificar el grupo de comando OLE el comando que desea controlar, el comando OLE y el identificador de comando de la mensaje WM_COMMAND que se enviará cuando se recibe el comando OLE. MFC proporciona también una serie de macros predefinidas para comandos OLE estándar. Para obtener una lista de OLE estándar comandos que fueron originalmente diseñados para utilizar con aplicaciones de Microsoft Office, vea la enumeración OLECMDID, que se define en docobj.h.
Cuando una aplicación MFC que contiene un mapa de comando OLE recibe un comando OLE, MFC intenta encontrar el identificador de comando y el grupo de comandos para el comando solicitado en el mapa de comando OLE de la aplicación. Si se encuentra una coincidencia, un mensaje WM_COMMAND es enviado a la aplicación que contiene el mapa de mando con el identificador de comando solicitado. (Consulte la descripción de ON_OLECMD a continuación). De esta manera, los comandos OLE enviados a una aplicación son transformados en mensajes WM_COMMAND por MFC. Los mensajes WM_COMMAND entonces se enrutan a través de mapas de mensajes de la aplicación utilizando el estándar MFC arquitectura de enrutamiento de comandos.
A diferencia de los mapas de mensajes MFC OLE comando mapas no son compatibles con ClassWizard. Los desarrolladores MFC deben agregar compatibilidad con mapa comando OLE y OLE comando mapa entradas a mano. OLE comando mapas pueden agregarse a servidores de documentos activos de MFC en cualquier clase que se encuentra en la cadena de enrutamiento de mensajes WM_COMMAND en el momento del documento activo está activo en el lugar en un contenedor. Estas clases incluyen clases de la aplicación derivadas de CWinApp, CView, CDocumenty COleIPFrameWnd. En contenedores de documento activo, sólo se pueden añadir mapas de comando OLE a la COleDocObjectItem-clase derivada. También, en contenedores de documento activo, los mensajes WM_COMMAND sólo se enviarán al mapa de mensaje en el COleDocObjectItem-clase derivada.
OLE comando Macros de mapa
Utilice las siguientes macros para agregar funcionalidad de mapa de comando a la clase:
DECLARE_OLECMD_MAP)
Esta macro va en la declaración de clase (normalmente en el archivo de encabezado) de la clase que contiene el mapa de comando.
BEGIN_OLECMD_MAP (theClass, baseClass)
theClass
Nombre de la clase que contiene el mapa de comando.
baseClass
Nombre de la clase base de la clase que contiene el mapa de comando.
Esta macro marca el comienzo de la ruta de comando. Utilizar esta macro en el archivo de implementación de la clase que contiene el mapa de comando.
END_OLECMD_MAP()
Esta macro marca el final de la ruta de comando. Utilice esta macro en el archivo de implementación de la clase que contiene el mapa de comando. Esta macro debe seguir siempre el BEGIN_OLECMD_MAP macro.
ON_OLECMD (pguid, olecmdid, id)
pguid
Puntero en el GUID del grupo de comando del comando OLE. Este parámetro es NULL para el grupo de comando OLE estándar.
olecmdid
OLE comando ID del comando para invocar.
id.
ID del mensaje WM_COMMAND enviará a la aplicación que contiene el mapa de comando cuando se invoca el comando OLE.
Uso del ON_OLECMD comandos de macro en el mapa de comando para agregar entradas para OLE que desea controlar. Cuando se reciben los comandos OLE, serán convertidos al mensaje WM_COMMAND especificado y enrutan a través del mapa de mensajes de la aplicación utilizando la arquitectura de enrutamiento de comandos estándar de MFC.
Ejemplo
En el ejemplo siguiente se muestra cómo agregar capacidad de manejo de comando OLE a un servidor de documentos activos de MFC para manejar la comando OLE OLECMDID_PRINT . Este ejemplo se supone que utiliza AppWizard para generar una aplicación MFC que es un servidor de documentos activos.
DECLARE_OLECMD_MAP macro a la declaración de clase.&Notanbsp; Utilice el CView-clase derivada porque es una de las clases en el servidor de documentos activos que hay en la cadena de enrutamiento de mensajes WM_COMMAND.
clase CMyServerView: CView pública
{
protegido: / / crear de serialización sólo
CMyServerView();
DECLARE_DYNCREATE(CMyServerView)
DECLARE_OLECMD_MAP()
. . .
}
BEGIN_OLECMD_MAP y END_OLECMD_MAP las macros:BEGIN_OLECMD_MAP (CMyServerView, CView)
END_OLECMD_MAP()
BEGIN_OLECMD_MAP (CMyServerView, CView)
ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
END_OLECMD_MAP()
Tenga en cuenta que una de las macros de comando OLE estándar definidas en afxdocob.h, podría utilizarse en lugar de la macro ON_OLECMD porque OLECMDID_PRINT es un identificador de comando OLE estándar. La macro ON_OLECMD_PRINT realizar la misma tarea como la macro ON_OLECMD arriba.
Cuando una aplicación contenedora envía a este servidor un comando OLECMDID_PRINT a través de la interfaz del servidor IOleCommandTarget , se invoca el controlador de comandos de impresión de MFC en el servidor, haciendo que el servidor de impresión de la aplicación. Código del contenedor de documentos activos para invocar el comando print añadido en los pasos anteriores sería algo como esto:
void CContainerCntrItem::DoOleCmd()
{
IOleCommandTarget * pCmd = NULL;
HRESULT hr = E_FAIL;
Ocm OLECMD = {OLECMDID_PRINT, 0};
HR = m_lpObject-gt;QueryInterface (IID_IOleCommandTarget, reinterpret_cast < vacío ** >(&pCmd));
if(Failed(HR))
retorno;
HR = pCmd - > QueryStatus (NULL, 1 & ocm, NULL);
if(succeeded(HR) & & (ocm.cmdf & OLECMDF_ENABLED))
{
//Command está disponible y habilitada llamarlo así
COleVariant vIn;
COleVariant vOut;
HR = pCmd - > Exec (NULL, OLECMDID_PRINT,
OLECMDEXECOPT_DODEFAULT, vIn & vOut);
Assert(succeeded(HR));
}
pCmd - > Release();
}
&Notas técnicas por número |nbsp; Notas técnicas por categoría