TN071: MFC IOleCommandTarget implementação

A interface IOleCommandTarget permite que objetos e seus contêineres para enviar comandos para os outros. Por exemplo, barras de ferramentas do objeto podem conter botões para comandos, como Imprimir, Visualizar impressão, Salvar, Novae Zoom. Se tal objeto foi incorporado em um contêiner que ofereça suporte a IOleCommandTarget, o objeto poderia habilitar seus botões e transmite os comandos para o contêiner para processamento quando o usuário clicou-los. Se um contêiner queria o objecto incorporado para imprimir próprio, ele poderia fazer este pedido enviando um comando por meio da interface IOleCommandTarget do objeto incorporado.

IOleCommandTarget é uma interface de automação-como ele é usado por um cliente para chamar métodos em um servidor. No entanto, usar o IOleCommandTarget salva a sobrecarga de fazer chamadas através de interfaces de automação porque os programadores não precisam usar o método Invoke normalmente caro de IDispatch.

No MFC, a interface IOleCommandTarget é usada pelos servidores do documento ativo para permitir que os recipientes do documento ativo enviar comandos ao servidor. A classe de servidor de documento ativo, CDocObjectServerItem, usa mapas de interface do MFC (consulte TN038: implementação IUnknown MFC/OLE) para implementar a interface IOleCommandTarget.

IOleCommandTarget também é implementada na classe COleFrameHook . COleFrameHook é uma classe do MFC não documentada que implementa a funcionalidade de janela de quadro de contentores de edição in-loco. COleFrameHook também usa mapas de interface do MFC para implementar a interface IOleCommandTarget . COleFrameHookda implementação de IOleCommandTarget encaminha comandos OLE para COleDocObjectItem-derivado recipientes do documento ativo. Isso permite que qualquer documento contêiner Active MFC receber mensagens de servidores do documento ativo contido.

Mapas de comando do MFC OLE

Desenvolvedores de MFC podem tirar proveito de IOleCommandTarget usando mapas de comando OLE do MFC. OLE mapas de comando são como mapas de mensagem, pois podem ser usados para mapear comandos OLE para funções de membro de classe que contém o mapa de comando. Para fazer este trabalho, coloque macros do mapa de comando para especificar o grupo de comando OLE do comando que você deseja manipular, o comando OLE e a identificação de comando do WM_COMMAND mensagem que será enviada quando o comando OLE é recebido. MFC também fornece um número de macros predefinidas para comandos OLE padrão. Para obter uma lista de OLE padrão comandos que originalmente foram projetados para uso com aplicativos do Microsoft Office, consulte a enumeração OLECMDID, que é definida em docobj.h.

Quando um comando OLE é recebido por um aplicativo do MFC que contém um mapa de comando OLE, MFC tenta localizar a ID de comando e o grupo de comando para o comando solicitado no mapa de comando OLE do aplicativo. Se uma correspondência for encontrada, uma mensagem WM_COMMAND é despachada para o aplicativo que contém o mapa de comando com o ID de comando solicitado. (Consulte a descrição de ON_OLECMD abaixo.) Desta forma, comandos OLE expedidos para um aplicativo são transformados em WM_COMMAND mensagens pelo MFC. As mensagens WM_COMMAND , em seguida, são roteadas por meio de mapas de mensagem do aplicativo usando o padrão MFC arquitetura de Roteamento de comando.

Ao contrário de mensagem mapas, mapas de comando OLE do MFC não são suportados pelo ClassWizard. Desenvolvedores de MFC devem adicionar suporte de mapa de comando OLE e entradas de mapa de comando OLE à mão. OLE comando mapas podem ser adicionados para servidores de documento MFC ativos em qualquer classe que é a Cadeia de roteamento de mensagem WM_COMMAND aquando do documento ativo é in-loco ativo em um contêiner. Essas classes incluem classes do aplicativo derivadas de CWinApp, CView, CDocumente COleIPFrameWnd. Em recipientes do documento ativo, mapas de comando OLE só podem ser adicionados para o COleDocObjectItem-classe derivada. Também, em recipientes de documento ativa, as mensagens WM_COMMAND só são expedidas para o mapa da mensagem no COleDocObjectItem-derivado classe.

OLE mapa Macros de comando

Use as seguintes macros para adicionar funcionalidade de mapa de comando à sua classe:

(DECLARE_OLECMD_MAP)

Essa macro vai na declaração da classe (normalmente no arquivo de cabeçalho) da classe que contém o mapa de comando.

BEGIN_OLECMD_MAP (theClass, baseClass)

theClass

Nome da classe que contém o mapa de comando.

baseClass

Nome da classe base da classe que contém o mapa de comando.

Essa macro marca o início do mapa de comando. Use essa macro no arquivo de implementação para a classe que contém o mapa de comando.

 END_OLECMD_MAP()

Essa macro marca o final do mapa de comando. Use essa macro no arquivo de implementação para a classe que contém o mapa de comando. Essa macro deve sempre seguir o BEGIN_OLECMD_MAP macro.

ON_OLECMD (pguid, olecmdid, id)

pguid

Ponteiro para o GUID do grupo de comando do comando OLE. Este parâmetro é NULL para o grupo de comando OLE padrão.

olecmdid

OLE identificação do comando para ser chamado do comando.

identificação

ID da mensagem WM_COMMAND a ser enviada para o aplicativo que contém o mapa de comando quando esse comando OLE é chamado.

Usar o ON_OLECMD macro do mapa de comando para adicionar entradas para o OLE comandos você deseja manipular. Quando os comandos OLE são recebidos, serão convertidos para a mensagem WM_COMMAND especificada e roteadas por meio de mapa de mensagem do aplicativo usando a arquitetura de roteamento de comando do MFC padrão.

Exemplo

O exemplo a seguir mostra como adicionar capacidade de manipulação de comando OLE para um servidor de documento ativo MFC para lidar com o comando OLE OLECMDID_PRINT . Este exemplo assume que você usou AppWizard para gerar um aplicativo do MFC que é um servidor de documento ativo.

  1. No seu CView-derivada cabeçalho da classe arquivo, adicionar o DECLARE_OLECMD_MAP macro para a declaração de classe.

    &Notanbsp;  Use o CView-classe derivada porque é uma das classes do servidor de documento ativo que é a Cadeia de roteamento de mensagem WM_COMMAND.

    classe CMyServerView: público CView
    {
    protegido: / / create de serialização somente
    CMyServerView();
    DECLARE_DYNCREATE(CMyServerView)
    DECLARE_OLECMD_MAP()
    . . .
    }
    
  2. No arquivo de implementação para CView-derivada de classe, adicionar a BEGIN_OLECMD_MAP e END_OLECMD_MAP macros:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Para lidar com o comando de impressão padrão do OLE, adicionar uma macro ON_OLECMD o mapa de comando especificando o ID de comando OLE para o comando de impressão padrão e ID_FILE_PRINT para a identificação de WM_COMMAND . ID_FILE_PRINT é o padrão ID do comando print usado por aplicativos MFC AppWizard-gerado:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

Observe que um das macros de comando OLE padrão, definidas no afxdocob. h, pode ser usado no lugar da macro ON_OLECMD porque OLECMDID_PRINT é uma identificação de comando OLE padrão. A macro ON_OLECMD_PRINT realizará a mesma tarefa como a macro ON_OLECMD mostrada acima.

Quando um aplicativo contêiner envia este servidor um comando OLECMDID_PRINT através da interface de IOleCommandTarget do servidor, o manipulador de comando de impressão MFC será chamado no servidor, fazendo com que o servidor para o aplicativo de impressão. Código do contêiner do documento ativo para invocar o comando print adicionado nas etapas acima poderia ser algo como isto:

privatevoid CContainerCntrItem::DoOleCmd()
{
   IOleCommandTarget * pCmd = NULL;
   HRESULT hr = E_FAIL;
   OLECMD ocm = {OLECMDID_PRINT, 0};

hr = m_lpObject-gt;Falha de QueryInterface (IID_IOleCommandTarget, reinterpret_cast < vazio ** >(&pCmd));
   if(Failed(hr))
      retornar;

hr = pCmd - > QueryStatus (NULL, 1, & ocm, NULL);
   if(succeeded(hr) & & (ocm.cmdf & OLECMDF_ENABLED))
   {
      //Command está disponível e habilitado então chamá-lo
      VIn de COleVariant;
      VOut COleVariant;
      hr = pCmd - > Exec (NULL, OLECMDID_PRINT,
 OLECMDEXECOPT_DODEFAULT, & vIn & vOut);
      Assert(succeeded(hr));
   }
   pCmd - > Release();
}

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index