TN071: implementazione di IOleCommandTarget MFC
[!NOTA]
La seguente nota tecnica non è stata aggiornata dalla prima volta che viene inclusa nella documentazione online.Di conseguenza, alcune procedure e argomenti potrebbero non essere aggiornati o errati.Per le informazioni più recenti, è consigliabile cercare l'argomento di interesseindice della documentazione online.
L'interfaccia di IOleCommandTarget abilita gli oggetti e i relativi contenitori alla spedizione ordina loro.Ad esempio, le barre degli strumenti di un oggetto possono contenere i pulsanti per controlli quali Stampa, Anteprima di stampa, Salva, Newe Zoom.Se tale oggetto è incorporato in un contenitore che supporta IOleCommandTarget, l'oggetto può abilitare i relativi pulsanti e ai controlli nel contenitore per l'elaborazione quando l'utente li ha fatto clic.Se un contenitore scegliere l'oggetto incorporato per stamparsi, possibile eseguire questa richiesta inviando un comando tramite l'interfaccia di IOleCommandTarget dell'oggetto incorporato.
IOleCommandTarget è un'interfaccia del tipo di automazione di utilizzata da un client per richiamare i metodi su un server.Tuttavia, l'utilizzo di IOleCommandTarget salva il sovraccarico di esecuzione di chiamate tramite le interfacce di automazione poiché i programmatori non devono utilizzare il metodo tipico oneroso di Invoke di IDispatch.
In MFC, l'interfaccia di IOleCommandTarget viene utilizzata dai server di documenti attivi per consentire i contenitori di documenti attivi ai controlli di invio al server.La classe del server di documenti attivi, CDocObjectServerItem, mappe dell'interfaccia di MFC (vedere TN038: implementazione di MFC/OLE IUnknown) per implementare l'interfaccia di IOleCommandTarget .
IOleCommandTarget viene implementato nella classe di COleFrameHook .COleFrameHook è una classe non documentata MFC che implementa la funzionalità della finestra cornice di contenitori di modifica sul posto.COleFrameHook utilizza anche i mapping dell'interfaccia MFC per implementare l'interfaccia di IOleCommandTarget .L'implementazione di COleFrameHook di IOleCommandTarget inoltra controlli a COleDocObjectItem- contenitore di documenti attivi derivati OLE.In questo modo il contenitore di documenti attivi MFC per ricevere i messaggi dai server di documenti attivi contenuto.
Mapping dei comandi OLE MFC
Gli sviluppatori di MFC possono beneficiare di IOleCommandTarget utilizzando i mapping dei comandi OLE MFC.I mapping dei comandi OLE sono analoghe alle mappe dei messaggi in quanto possono essere utilizzati per eseguire il mapping dei comandi OLE alle funzioni membro di classe che contiene il mapping del comando.Per eseguire questa operazione, le macro del punto del mapping di comando per specificare il gruppo di comandi OLE del comando che si desidera gestire, il comando OLE e l'ID di comando del messaggio di WM_COMMAND che verrà inviato quando il comando OLE viene ricevuto.MFC offre varie macro predefinite per i controlli standard OLE.Per un elenco di comandi OLE standard in cui sono stati progettati per l'utilizzo con le applicazioni di Microsoft Office, vedere l'enumerazione di OLECMDID, definita in docobj.h.
Quando un comando OLE viene ricevuto da un'applicazione MFC che contiene una mappa di comando OLE, MFC tenta di trovare l'ID di comando e il gruppo di controlli per il comando obbligatoria nella mappa dei comandi OLE dell'applicazione.Se viene individuata una corrispondenza, un messaggio di WM_COMMAND viene inviato all'applicazione contenente il mapping di comando con l'ID di comando obbligatoria.(Vedere la descrizione di ON_OLECMD di seguito.) In questo modo, i comandi OLE inviati a un'applicazione vengono passati nei messaggi di WM_COMMAND da MFC.I messaggi di WM_COMMAND quindi sono indirizzati attraverso le mappe dei messaggi dell'applicazione utilizzando l'architettura standard MFC routing dei comandi .
A differenza delle mappe dei messaggi, i mapping dei comandi OLE MFC non sono supportati da ClassWizard.Gli sviluppatori di MFC è necessario aggiungere manualmente le voci della mappa di supporto del mapping del comando OLE e del comando OLE.I mapping dei comandi OLE è possibile aggiungere ai server di documenti attivi MFC in qualsiasi classe che si trova nella catena di instradamento dei messaggi di WM_COMMAND al momento del documento attivo è attivo sul posto in un contenitore.Queste classi sono incluse le classi dell'applicazione derivate da CWinApp, da CView, da CDocumente da COleIPFrameWnd.Nei contenitori di documenti attivi, i mapping dei comandi OLE possono essere aggiunti solo a COleDocObjectItemclasse derivata da.Inoltre, in contenitore di documenti attivi, i messaggi di WM_COMMAND saranno inviati solo alla mappa messaggi in COleDocObjectItemclasse derivata da.
Macro di mapping dei comandi OLE
Utilizzare le macro seguenti per aggiungere la funzionalità di mapping del comando alla classe:
DECLARE_OLECMD_MAP ()
Questa macro viene inserito nella dichiarazione di classe (in genere nel file di intestazione) della classe che contiene il mapping del comando.
BEGIN_OLECMD_MAP(theClass, baseClass)
theClass
Nome della classe che contiene il mapping del comando.baseClass
Nome della classe base della classe che contiene il mapping del comando.
Questa macro contrassegna l'inizio del mapping del comando.Utilizzare questa macro nel file di implementazione della classe contenente il mapping del comando.
END_OLECMD_MAP()
Questa macro contrassegna la fine del mapping del comando.Utilizzare questa macro nel file di implementazione della classe contenente il mapping del comando.Questa macro necessario seguire sempre la macro di BEGIN_OLECMD_MAP .
ON_OLECMD(pguid, olecmdid, id)
pguid
Puntatore al GUID del gruppo di controlli di comando OLE.Questo parametro è NULL per il gruppo di comandi OLE standard.olecmdid
ID di comando OLE di comando essere richiamato.id
ID del messaggio di WM_COMMAND da inviare all'applicazione contenente il mapping di comando quando questo comando OLE viene richiamato.
Utilizzare la macro di ON_OLECMD il mapping di comando per aggiungere voci per i controlli che OLE si desidera gestire.Quando i comandi OLE vengono ricevuti, verranno convertiti nel messaggio specificato di WM_COMMAND e saranno indirizzati attraverso la mappa messaggi dell'applicazione utilizzando l'architettura di routing dei comandi MFC standard.
Esempio
Nell'esempio seguente viene illustrato come aggiungere funzionalità della gestione di OLE in un server di documenti attivi MFC gestire il comando di OLECMDID_PRINT OLE.In questo esempio si presuppone che sia utilizzato AppWizard per generare un'applicazione MFC che è un server di documenti attivi.
Nel CView- file di intestazione derivato dalla classe, aggiunge la macro di DECLARE_OLECMD_MAP alla dichiarazione di classe.
[!NOTA]
Utilizzare CViewclasse derivata perché è una delle classi nel server di documenti attivi nella catena di instradamento dei messaggi di WM_COMMAND .
class CMyServerView : public CView { protected: // create from serialization only CMyServerView(); DECLARE_DYNCREATE(CMyServerView) DECLARE_OLECMD_MAP() . . . };
Nel file di implementazione per CViewnella classe derivata da, aggiungere le macro di END_OLECMD_MAP e di BEGIN_OLECMD_MAP :
BEGIN_OLECMD_MAP(CMyServerView, CView) END_OLECMD_MAP()
Per gestire il comando di stampa OLE standard, aggiungere una macro di ON_OLECMD il mapping di comando che specifica l'ID di comando OLE per il comando di stampa standard e ID_FILE_PRINT per l'identificazione di WM_COMMANDID_FILE_PRINT è l'ID di comando di stampa standard utilizzato dalle applicazioni AppWizard-generate MFC:
BEGIN_OLECMD_MAP(CMyServerView, CView) ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT) END_OLECMD_MAP()
Si noti che i controlli macro OLE standard, definito in afxdocob.h, potrebbe essere utilizzato al posto di una macro di ON_OLECMD perché OLECMDID_PRINT è un ID di comando standard OLELa macro di ON_OLECMD_PRINT compirà la stessa attività di macro di ON_OLECMD sopraindicata.
Quando un'applicazione contenitore invia il server un comando di OLECMDID_PRINT tramite l'interfaccia di IOleCommandTarget del server, il gestore comando di stampa MFC verrà richiamato nel server, in modo che il server di stampa l'applicazione.Il codice del contenitore di documenti attivi per richiamare il comando di stampa aggiunto nei passaggi sopra potrebbe essere analogo al seguente:
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();
}