TN071: MFC IOleCommandTarget attuazione

L'interfaccia IOleCommandTarget consente di oggetti e loro contenitori per l'invio di comandi a vicenda. Ad esempio, le barre degli strumenti di un oggetto può contenere pulsanti per i comandi quali stampa, Anteprima di stampa, salvare, Newe Zoom. Se tale oggetto sono stato incorporato in un contenitore che supporta IOleCommandTarget, l'oggetto potrebbe attivare i relativi pulsanti e inoltrare i comandi per il contenitore per l'elaborazione quando l'utente fa clic su loro. Se un contenitore voleva l'oggetto incorporato per la stampa stessa, potrebbe fare questa richiesta inviando un comando tramite l'interfaccia IOleCommandTarget dell'oggetto incorporato.

IOleCommandTarget è un'interfaccia simile a automazione in esso viene utilizzato da un client per richiamare i metodi su un server. Tuttavia, utilizzando IOleCommandTarget consente di risparmiare il sovraccarico di effettuare chiamate tramite interfacce di automazione, perché i programmatori non devono utilizzare il metodo Invoke tipicamente costoso di IDispatch.

In MFC, l'interfaccia IOleCommandTarget viene utilizzata dal server di documenti attivi per consentire contenitori documento attivo di inviare comandi al server. La classe server documento attivo, CDocObjectServerItem, utilizza le mappe di interfaccia di MFC (vedere TN038: implementazione IUnknown MFC/OLE) per implementare l'interfaccia IOleCommandTarget.

Anche IOleCommandTarget è implementata nella classe COleFrameHook . COleFrameHook è una classe MFC privi di documenti che implementa la funzionalità di finestra cornice di contenitori di modifica sul posto. COleFrameHook utilizza anche mappe di interfaccia di MFC per implementare l'interfaccia IOleCommandTarget . COleFrameHookdi attuazione della IOleCommandTarget inoltra comandi OLE al COleDocObjectItem-derivati contenitori del documento attivo. In questo modo qualsiasi contenitore di documenti attivi MFC ricevere messaggi da server documento contenuto attivo.

Mappe di comando OLE MFC

MFC gli sviluppatori possono usufruire di IOleCommandTarget utilizzando le mappe di comando OLE di MFC. Mappe di comando OLE sono come messaggio maps perché possono essere utilizzati per mappare i comandi OLE alle funzioni membro della classe che contiene il comando mappa. Per fare questo lavoro, posizionare le macro nella mappa del comando per specificare il gruppo di comando OLE dell'ID del comando, il comando OLE e il comando che si desidera gestire il messaggio WM_COMMAND che verrà inviato quando viene ricevuto il comando OLE. MFC fornisce anche una serie di macro predefinite per comandi standard OLE. Per un elenco degli standard OLE comandi che sono stati originariamente concepiti per utilizzo con applicazioni di Microsoft Office, vedere l'enumerazione OLECMDID, che è definito in docobj.h.

Quando un comando OLE viene ricevuto da un'applicazione MFC che contiene una mappa di comando OLE, MFC tenterà di trovare l'ID di comando e il gruppo di comando per il comando richiesto nella mappa del comando OLE dell'applicazione. Se viene trovata una corrispondenza, viene inviato un messaggio WM_COMMAND all'applicazione contenente la mappa di comando con l'ID del comando richiesto. (Vedi la descrizione del ON_OLECMD qui sotto). In questo modo, i comandi OLE spediti a un'applicazione vengono trasformati in messaggi WM_COMMAND da MFC. I messaggi WM_COMMAND vengono quindi instradati attraverso mappe di messaggi dell'applicazione utilizzando lo standard MFC architettura del comando routing.

A differenza del messaggio mappe, mappe di comando OLE MFC non sono supportati da ClassWizard. MFC gli sviluppatori devono aggiungere supporto mappa del comando OLE e voci della mappa comando OLE a mano. OLE comando mappe possono essere aggiunti a MFC Active Server di documenti in qualsiasi classe che è nella catena di routing dei messaggi WM_COMMAND al tempo del documento attivo è attivo sul posto in un contenitore. Queste classi includono classi dell'applicazione, derivate da CWinApp, CView, CDocumente COleIPFrameWnd. In contenitori del documento attivo, OLE comando mappe possono essere aggiunti solo per il COleDocObjectItem-classe derivata. Inoltre, in contenitori di documento attivo, i messaggi WM_COMMAND saranno solo essere spediti verso la mappa di messaggio nella COleDocObjectItem-classe derivata.

OLE le macro delle mappe di comando

Utilizzare le seguenti macro per aggiungere funzionalità di comando mappa alla classe:

DECLARE_OLECMD_MAP)

Questa macro va nella dichiarazione della classe (in genere nel file di intestazione) della classe che contiene il comando mappa.

BEGIN_OLECMD_MAP (theClass, baseClass)

theClass

Nome della classe che contiene il comando mappa.

baseClass

Nome della classe base della classe che contiene il comando mappa.

Questa macro segna l'inizio della mappa di comando. Utilizzare questa macro nel file di implementazione per la classe che contiene il comando mappa.

 END_OLECMD_MAP()

Questa macro segna la fine della mappa di comando. Utilizzare questa macro nel file di implementazione per la classe che contiene la mappa di comando. Questa macro deve sempre seguire il BEGIN_OLECMD_MAP macro.

ON_OLECMD (pguid, olecmdid, id)

pguid

Puntatore al GUID del gruppo di comando del comando OLE. Questo parametro è NULL per il gruppo di comando OLE standard.

olecmdid

OLE comando ID del comando di essere richiamati.

identificazione

ID del messaggio WM_COMMAND per essere inviati all'applicazione contenente la mappa di comando quando viene richiamato questo comando OLE.

Uso il ON_OLECMD macro nella mappa comando per aggiungere voci per la OLE comandi che si desidera gestire. Quando vengono ricevuti i comandi OLE, saranno convertiti al messaggio WM_COMMAND specificato e instradate attraverso la mappa di messaggi dell'applicazione utilizzando l'architettura di routing di comandi MFC standard.

Esempio

Nell'esempio seguente viene illustrato come aggiungere la funzionalità di gestione dei comandi OLE per un server di documenti attivi MFC per gestire il comando OLE OLECMDID_PRINT . Nell'esempio si presuppone che si è utilizzato Creazione guidata applicazione per generare un'applicazione MFC che è un server Active document.

  1. Nel vostro CView-derivati intestazione della classe file, aggiungere il DECLARE_OLECMD_MAP macro per la dichiarazione di classe.

    &Notanbsp;  Utilizzare il CView-classe derivata perché è una delle classi in server di documenti attivi che è nella catena di routing dei messaggi WM_COMMAND.

    classe CMyServerView: CView pubblica
    {
    protetto: / / create dalla serializzazione solo
    CMyServerView();
    DECLARE_DYNCREATE(CMyServerView)
    DECLARE_OLECMD_MAP()
    . . .
    }
    
    
  2. Nel file di implementazione per il CView-classe derivata aggiungere il BEGIN_OLECMD_MAP e END_OLECMD_MAP macro:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    
    END_OLECMD_MAP()
    
    
  3. Per gestire il comando stampa standard OLE, aggiungere una macro ON_OLECMD alla mappa comando specificando l'ID di comando OLE per il comando di stampa standard e ID_FILE_PRINT per l'ID di WM_COMMAND . ID_FILE_PRINT è lo standard di ID di comando di stampa utilizzati dalle applicazioni MFC generato da creazione guidata applicazione:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    
    

Si noti che uno degli standard OLE comando macro, definite in afxdocob.h, potrebbe essere utilizzato al posto della macro ON_OLECMD perché OLECMDID_PRINT è un standard OLE comando ID. La macro ON_OLECMD_PRINT compirà la stessa attività di macro ON_OLECMD sopra indicata.

Quando un'applicazione contenitore Invia questo server un comando OLECMDID_PRINT attraverso l'interfaccia IOleCommandTarget del server, verrà richiamato il gestore di comandi MFC stampa nel server, causando il server per l'applicazione di stampa. Codice del contenitore di documenti attivi di richiamare il comando di stampa aggiunto nei passaggi sopra sarebbe guardare qualcosa di simile:

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

HR = m_lpObject-gt;QueryInterface (IID_IOleCommandTarget, reinterpret_cast < vuoto ** >(&pCmd));
   if(failed(hr))
      ritorno;

HR = pCmd - > QueryStatus (NULL, 1 & ocm, NULL);
   if(SUCCEEDED(hr) & & (ocm.cmdf e OLECMDF_ENABLED))
   {
      //Command è disponibile e abilitata chiamarlo così
      COleVariant vIn;
      COleVariant vOut;
      HR = pCmd - > Exec (NULL, OLECMDID_PRINT,
 OLECMDEXECOPT_DODEFAULT, vIn &, vOut);
      Assert(SUCCEEDED(hr));
   }
   pCmd - > errato;
}

&Note tecniche per numero |nbsp; Note tecniche per la categoria

Index