TN071: MFC IOleCommandTarget implementação
Observação |
---|
A seguinte nota técnica não foi atualizada desde que foi incluída pela primeira vez na documentação online.Como resultado, alguns procedimentos e tópicos podem estar desatualizado ou incorreto.As informações mais recentes, é recomendável que você procure o tópico de interesse no índice de documentação on-line. |
O IOleCommandTarget interface permite que os objetos e seus recipientes para enviar comandos ao outro.Por exemplo, barras de ferramentas do objeto podem conter botões para comandos como Print, Visualizar impressão, Salvar, New, e Zoom.Se tal objeto foram incorporados em um recipiente que ofereça suporte a IOleCommandTarget, o objeto poderia ativar seus botões e encaminhar os comandos para o recipiente para processamento quando o usuário clicou-los.Se um contêiner queria o objeto incorporado para imprimir a mesmo, que ela poderia fazer esta 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 chamadas por meio de interfaces de automação porque os programadores não precisam usar normalmente caros Invoke método de IDispatch.
No MFC, o IOleCommandTarget interface é usado por 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 mapas de interface do MFC (consulte TN038: MFC/OLE IUnknown implementação) para implementar a IOleCommandTarget interface.
IOleCommandTargettambém é implementado no COleFrameHook classe.COleFrameHook é uma classe do MFC não documentada que implementa a funcionalidade de janela de quadro do local edição recipientes.COleFrameHook também usa mapas de interface do MFC para implementar a IOleCommandTarget interface.COleFrameHookda implementação de IOleCommandTarget encaminha comandos OLE COleDocObjectItem-derivado de recipientes do documento ativo.Isso permite que qualquer contêiner do documento ativo do MFC receber mensagens de servidores do documento ativo.
Mapas de comando do MFC OLE
Os desenvolvedores MFC podem tirar proveito de IOleCommandTarget usando OLE do MFC comando mapas.Mapas de comando OLE são como mapas de mensagem, pois eles podem ser usados para mapear comandos OLE para funções de membro da classe que contém o mapa de comando.Para fazer esse trabalho, colocar as macros no mapa de comando para especificar o grupo de comando OLE do comando deseja manipular, comando OLE e a identificação de comando da WM_COMMAND mensagem 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 foram originalmente projetados para usar com aplicativos de 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 encontrar o 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, um WM_COMMAND mensagem é enviada para o aplicativo que contém o mapa de comando com a identificação do comando solicitado.(Consulte a descrição de ON_OLECMD abaixo.) Dessa forma, os comandos OLE despachados para um aplicativo são transformados em WM_COMMAND mensagens pelo MFC.O WM_COMMAND as mensagens são roteadas mapas de mensagem do aplicativo usando o padrão MFC comando roteamento arquitetura.
Ao contrário de mensagem mapas, mapas de comando OLE do MFC não são suportados pelo ClassWizard.Os desenvolvedores MFC devem adicionar suporte a OLE comando map e entradas de mapa de comando OLE à mão.OLE mapas de comando podem ser adicionados para servidores de documento ativo do MFC em qualquer classe que está sendo o WM_COMMAND cadeia de roteamento de mensagens no momento em que o documento ativo está ativo no local em um recipiente.Essas classes incluem classes do aplicativo derivadas de CWinApp, CView, CDocument, e COleIPFrameWnd.Recipientes do documento ativo, mapas de comando OLE só podem ser adicionados para o COleDocObjectItem-classe derivada.Além disso, nos recipientes do documento ativo, o WM_COMMAND mensagens somente serão expedidas para o mapa da mensagem na COleDocObjectItem-classe derivada.
Macros de mapa de comando OLE
Use as seguintes macros para adicionar funcionalidade do comando map para 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 é Nulo para o grupo de comando OLE padrão.olecmdid
ID de comando OLE do comando a ser invocado.id
ID do WM_COMMAND mensagem sejam enviadas para o aplicativo que contém o mapa de comando quando esse comando OLE é chamado.
Use o ON_OLECMD macro no mapa de comando para adicionar entradas para o OLE comandos você deseja manipular.Quando os comandos OLE são recebidos, eles serão convertidos para o WM_COMMAND mensagem e roteadas através do mapa da mensagem do aplicativo usando a arquitetura de roteamento de comando do MFC padrão.
Exemplo
O exemplo a seguir mostra como adicionar o recurso de manipulação de comando OLE para um servidor de documento ativo do MFC para manipular a OLECMDID_PRINT comando OLE.Este exemplo assume que você usou o AppWizard para gerar um aplicativo do MFC é um servidor do documento ativo.
No seu CView-derivada cabeçalho da classe de arquivo, adicionar o DECLARE_OLECMD_MAP macro para a declaração de classe.
Observação Use o CView-classe derivada porque é uma das classes do servidor do documento ativo que está na WM_COMMAND a cadeia de roteamento de mensagens.
class CMyServerView : public CView { protected: // create from serialization only CMyServerView(); DECLARE_DYNCREATE(CMyServerView) DECLARE_OLECMD_MAP() . . . };
No arquivo de implementação para o CView-derivado classe, adicione o BEGIN_OLECMD_MAP e END_OLECMD_MAP macros:
BEGIN_OLECMD_MAP(CMyServerView, CView) END_OLECMD_MAP()
Para lidar com o comando de impressão padrão OLE, adicionar um ON_OLECMD macro no mapa de comando especificando a identificação de comando OLE para o comando de impressão padrão e ID_FILE_PRINT para o WM_COMMAND ID.ID_FILE_PRINT é o padrão de identificação de comando de impressão usada por 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 em afxdocob.h, pode ser usada no lugar da ON_OLECMD macro porque OLECMDID_PRINT é uma ID de comando OLE padrão.O ON_OLECMD_PRINT macro irá realizar a mesma tarefa como a ON_OLECMD macro mostrada acima.
Quando um aplicativo de contêiner envia este servidor um OLECMDID_PRINT comando através do servidor IOleCommandTarget interface, o MFC manipulador de comandos de impressão será invocado no servidor, fazendo com que o servidor de impressão do aplicativo.Código do contêiner do documento ativo para invocar o comando Imprimir adicionado nas etapas acima seria algo assim:
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();
}