Compartilhar via


TN071: Implementação de IOleCommandTarget MFC

Observação:

A seguinte nota técnica não foi atualizada desde que foi incluída pela primeira vez na documentação online.sistema autônomo resultado, alguns procedimentos e tópicos podem estar desatualizado ou incorreto.Para obter informações mais recentes, é recomendável que você procurar o tópico de interesse no índice de documentação online.

The IOleCommandTarget interface permite que objetos e seus recipientes para enviar comandos ao Outros. Por exemplo, barras de ferramentas do objeto podem conter botões para comandos sistema autônomo, por exemplo, Impressão, Visualizar impressão, Salvar, New, e Aplicar zoom.Se tal objeto foram incorporado em um contêiner que ofereça suporte a IOleCommandTarget, o objeto poderia ativar seus botões e encaminhar os comandos para o contêiner para processamento quando o usuário clicou-los. Se um contêiner queria o objeto incorporado para imprimir propriamente dito, ele pode torná essa solicitação enviando um comando por meio de IOleCommandTarget interface do objeto incorporado.

IOleCommandTarget é uma interface de automação que é usado por um cliente para chamar métodos em um servidor. No entanto, usando IOleCommandTarget salva a sobrecarga de fazer chamadas por meio de interfaces de automação porque os programadores não precisa usar normalmente caros Invoke método de IDispatch.

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

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

Mapas de comando do MFC OLE

Os desenvolvedores MFC podem tirar proveito de IOleCommandTarget usando MFC OLE comando mapas. Mapas de comando OLE são como mensagem mapeia porque pode ser usados para mapear comandos OLE funções de membro de classe que contém o MAP de comando.Para que isso funcione, coloque as macros no MAP de comando para especificar o agrupar de comando OLE de comando que você deseja lidar com, o comando OLE e o ID de comando do WM_COMMAND mensagem será enviada quando o comando OLE é recebido.MFC também fornece inúmeras macros predefinidas para comandos OLE padrão.Para obter uma lista de OLE padrão comandos que foram originalmente concebidos para usar com aplicativos do Microsoft Office, consulte a enumeração OLECMDID, que é definida em docobj.h.

Quando um comando OLE é recebido por um aplicativo MFC que contém um MAP de comando OLE, o MFC tenta encontrar o ID de comando e o agrupar de comandos para o comando solicitado no MAP de comando OLE do aplicativo.Se uma correspondência for encontrada, um WM_COMMAND mensagem será enviada para o aplicativo que contém o MAP de comando com a ID do comando solicitado.(Consulte a descrição de ON_OLECMD abaixo). Dessa forma, o OLE comandos enviados para um aplicativo são transformados em WM_COMMAND mensagens pelo MFC.The WM_COMMAND mensagens, em seguida, são roteadas através de mapas de mensagem do aplicativo usando o MFC padrão roteamento de comando arquitetura.

Ao contrário dos mapas de mensagem, mapas de comando MFC OLE não são suportados pelo ClassWizard.Os desenvolvedores MFC devem adicionar suporte a OLE comando MAP e entradas de MAP de comando OLE manualmente.Mapas de comando OLE podem ser adicionados ao MFC Active servidores de documento em qualquer classe que está no WM_COMMAND cadeia roteamento de mensagens no momento em que o documento ativo está ativo no local em um contêiner.Essas classes incluem classes do aplicativo derivadas de CWinApp, CView, CDocument, and COleIPFrameWnd.Em contêineres do documento ativo, mapas de comando OLE só podem ser adicionados à COleDocObjectItem-classe derivada.Além disso, em contêineres do documento ativo, a WM_COMMAND mensagens só serão expedidas para o MAP da mensagem no COleDocObjectItem-classe derivada.

OLE comando MAP de macros

Use as seguintes macros para adicionar funcionalidade do comando MAP à sua classe:

DECLARE_OLECMD_MAP ()

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

BEGIN_OLECMD_MAP(theClass, baseClass)
  • theClass
    Nome da classe que contém o MAP de comando.

  • baseClass
    Nome da classe base da classe que contém o MAP de comando.

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

END_OLECMD_MAP()

Essa macro marca o participante do MAP do comando.Use essa macro no arquivo de implementação para a classe que contém o MAP de comando.Essa macro sempre deverá seguir o BEGIN_OLECMD_MAP macro.

ON_OLECMD(pguid, olecmdid, id)
  • pguid
    Ponteiro para o GUID do agrupar de comando do comando OLE.Este parâmetro é NULO para o agrupar de comando OLE padrão.

  • olecmdid
    ID de comando OLE do comando a ser invocado.

  • id
    ID do WM_COMMAND mensagem seja enviada para o aplicativo que contém o MAP de comando quando este comando OLE é chamado.

Use o ON_OLECMD macro no MAP de comando para adicionar entradas para os comandos OLE que você deseja manipular. Quando os comandos do OLE são recebidos, eles serão convertidos para o especificado WM_COMMAND mensagem e roteadas através do MAP da 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 a um servidor de documento MFC ativo para manipular o OLECMDID_PRINT Comando OLE.Este exemplo parte do pressuposto de que você usou AppWizard para gerar um aplicativo MFC que é um servidor do documento ativo.

  1. No seu CViewcabeçalho-classe derivada's de arquivos, adicionar a DECLARE_OLECMD_MAP macro para a declaração da classe.

    Observação:

    Use o CView-classe derivada porque é uma das classes no servidor do documento ativo que está sendo o WM_COMMAND cadeia de roteamento de mensagens.

    class CMyServerView : public CView
    {
    protected: // create from serialization only
       CMyServerView();
       DECLARE_DYNCREATE(CMyServerView)
       DECLARE_OLECMD_MAP()
    . . .
    };
    
  2. No arquivo de implementação para o CView-derivada da classe, adicione o 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 de OLE padrão, adicione um ON_OLECMD macro para o MAP de comando, especificando a identificação de comando OLE para o comando de impressão padrão e ID_FILE_PRINT for the WM_COMMAND ID.ID_FILE_PRINT é a ID de comando de impressão padrão usada pelos aplicativos MFC AppWizard gerado:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
       ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

Observe que uma das macros de comando OLE padrão, definidas no afxdocob.h, pode ser usada em vez do ON_OLECMD macro porque OLECMDID_PRINT é uma ID de comando OLE padrão.The ON_OLECMD_PRINT macro realizará a mesma tarefa sistema autônomo a ON_OLECMD macro mostrada acima.

Quando um aplicativo de contêiner envia esse servidor um OLECMDID_PRINT comando através IOleCommandTarget interface, o MFC manipulador de comandos de impressão será invocado 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 de impressão adicionado nas etapas acima poderia ter esta aparência:

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

   hr = m_lpObject->QueryInterface(IID_IOleCommandTarget,reinterpret_cast<void**>(&pCmd));
   if(FAILED(hr))
      return;

   hr = pCmd->QueryStatus(NULL, 1, &ocm, NULL);
   if(SUCCEEDED(hr) && (ocm.cmdf & OLECMDF_ENABLED))
   {
      //Command is available and enabled so call it
      COleVariant vIn;
      COleVariant vOut;
      hr = pCmd->Exec(NULL, OLECMDID_PRINT,
 OLECMDEXECOPT_DODEFAULT, &vIn, &vOut);
      ASSERT(SUCCEEDED(hr));
   }
   pCmd->Release();
}

Consulte também

Outros recursos

Notas técnicas por número

Notas técnicas por categoria