TN071: MFC IOleCommandTarget-Implementierung

Die IOleCommandTarget -Schnittstelle ermöglicht es, Objekte und ihre Container, Befehle miteinander zu versenden. Beispielsweise können ein Objekt Symbolleisten Schaltflächen für Befehle wie z. B. Drucken, Seitenansicht, Speichern, neuund Zoomenthalten. Wenn ein solches Objekt in einem Container, die IOleCommandTargetunterstützt eingebettet waren, könnte das Objekt die Schaltflächen Aktivieren und weiterleiten die Befehle zum Container für die Verarbeitung, wenn der Benutzer sie geklickt. Wenn ein Container das eingebettete Objekt selbst drucken wollte, könnte es diese Anforderung machen, durch das Senden eines Befehls über die IOleCommandTarget -Schnittstelle des eingebetteten Objekts.

IOleCommandTarget ist eine Automatisierung-ähnliche Oberfläche, dass es von einem Client zum Aufrufen von Methoden auf einem Server verwendet wird. Verwendung von IOleCommandTarget spart jedoch den Aufwand für das Telefonieren über Automatisierungsschnittstellen weil Programmierer nicht zu verwenden, die in der Regel teuer Invoke -Methode von IDispatch.

In MFC wird die IOleCommandTarget -Schnittstelle von Active Document-Servern zum Active Document-Container, um Befehle an den Server senden können. Das aktive Dokument Serverklasse CDocObjectServerItem, verwendet MFC-Schnittstelle Karten (siehe TN038: MFC/OLE IUnknown Umsetzung) die IOleCommandTarget -Schnittstelle implementieren.

IOleCommandTarget ist auch in der COleFrameHook -Klasse implementiert. COleFrameHook ist eine nicht dokumentierte MFC-Klasse, die die Frame-Fenster-Funktionen des in-Place-Bearbeitung Container implementiert. COleFrameHook verwendet MFC-Schnittstelle Karten auch die IOleCommandTarget -Schnittstelle implementieren. COleFrameHookImplementierung von IOleCommandTarget leitet OLE-Befehle zu COleDocObjectItem-abgeleitet von Active Document-Container. Dadurch wird jede MFC Active Document-Container zum Empfangen von Nachrichten von enthaltenen Active Document-Server.

MFC OLE Befehl Karten

MFC-Entwickler können IOleCommandTarget nutzen mithilfe von MFC-OLE-Befehl-Zuordnungen. OLE sind Befehl Karten wie Meldungszuordnungen, weil sie verwendet werden können, um OLE-Befehle Memberfunktionen der Klasse zuzuordnen, die den Befehl enthält. Um diese Arbeit zu machen, platzieren Sie Makros in der Befehl Map auf geben die OLE-Befehl-Gruppe den Befehl, die Sie behandeln möchten, das OLE-Befehl und die Befehls-ID des der WM_COMMAND -Nachricht, die gesendet wird, wenn der OLE-Befehl empfangen wird. MFC stellt auch eine Reihe von vordefinierten Makros für standard-OLE-Befehle. Eine Liste der standard-OLE-Befehle, die ursprünglich für entwickelt wurden mit Microsoft Office-Anwendungen verwenden, finden Sie unter der OLECMDID-Aufzählung, die in docobj.h definiert ist.

Wenn ein OLE-Befehl von einer MFC-Anwendung, die eine OLE-Befehl Map enthält empfangen wird, versucht MFC, die Befehls-ID und die Befehlsgruppe, die für den angeforderten Befehl in der OLE-Befehl-Zuordnung der Anwendung finden. Wenn eine Übereinstimmung gefunden wird, wird eine WM_COMMAND -Nachricht an Anwendung, enthält der Befehl Karte mit der ID der angeforderten Befehl verteilt. (Siehe die Beschreibung von ON_OLECMD unten.) Auf diese Weise werden OLE-Befehle entsandt, um eine Anwendung von MFC in WM_COMMAND -Nachrichten umgewandelt. Die WM_COMMAND -Nachrichten werden dann durch die Anwendung Meldungszuordnungen mithilfe der Standard-MFC geleitet Befehlsrouting Architektur.

Im Gegensatz zu Meldungszuordnungen sind Karten für das MFC-OLE-Befehl von Klassen-Assistenten nicht unterstützt. MFC-Entwickler müssen von hand OLE Karte Führungsunterstützung und OLE Befehl Einträge hinzufügen. OLE ist Befehl, den Karten, MFC Active Document-Server in jeder Klasse hinzugefügt werden können, die zum Zeitpunkt des aktiven Dokuments in die WM_COMMAND -Nachrichten-routing-Kette ist in-Place aktiv in einem Container. Diese Klassen umfassen die Anwendung von CWinApp, CView, CDocumentund COleIPFrameWndabgeleiteten Klassen. Im Active Document-Container, OLE Befehl Karten können nur hinzugefügt werden die COleDocObjectItem-Klasse abgeleitet. Auch in Active Document-Container, die WM_COMMAND -Nachrichten werden nur versandt werden die Meldungszuordnung in die COleDocObjectItem-Klasse abgeleitet.

OLE Befehl Makros anzeigen

Verwenden Sie die folgenden Makros Ihre Klasse Befehl Karte Funktionalität hinzu:

(DECLARE_OLECMD_MAP)

Dieses Makro geht in der Klassendeklaration die Klasse enthält den Befehl anzeigen (in der Regel in der Header-Datei).

BEGIN_OLECMD_MAP (TheClass, BaseClass)

theClass

Name der Klasse, die den Befehl enthält.

baseClass

Name der Basisklasse die Klasse enthält den Befehl anzeigen.

Dieses Makro markiert den Beginn der Befehl anzeigen. Verwenden Sie dieses Makro in der Implementierungsdatei für die Klasse enthält den Befehl anzeigen.

 END_OLECMD_MAP()

Dieses Makro markiert das Ende des Befehls anzeigen. Verwenden Sie dieses Makro in der Implementierungsdatei für die Klasse, die den Befehl enthält. Dieses Makro muss befolgen Sie unbedingt die BEGIN_OLECMD_MAP Makros.

ON_OLECMD (Pguid, Olecmdid, Id)

pguid

Zeiger auf die GUID der Befehlsgruppe, die dem OLE-Befehl. Dieser Parameter ist NULL für der Gruppe standard OLE-Befehl.

olecmdid

OLE Befehls-ID des Befehls aufgerufen werden.

id

ID die WM_COMMAND -Nachricht gesendet werden, um die Anwendung mit dem Befehl anzeigen wenn diese OLE-Befehl aufgerufen wird.

Verwendung der ON_OLECMD -Makro in der Karte der Befehl zum Hinzufügen von Einträgen für die OLE-Befehle behandelt werden sollen. Wenn die OLE-Befehle empfangen werden, werden in der angegebenen WM_COMMAND -Nachricht konvertiert und über die Anwendung der Meldungszuordnung mithilfe der MFC-Befehlsrouting Standardarchitektur geleitet.

Beispiel

Im folgenden Beispiel wird veranschaulicht, wie ein MFC Active Document-Server zu handhaben OLE Befehlsbehandlung Funktion hinzu die OLECMDID_PRINT OLE-Befehl. In diesem Beispiel wird davon ausgegangen, dass Sie der Anwendungs-Assistent verwendet, um eine MFC-Anwendung zu generieren, die einen Active Document-Server ist.

  1. In Ihrer CView-abgeleitete Klasse die Header Datei, fügen Sie die DECLARE_OLECMD_MAP Makro zur Deklaration Klasse.

    Hinweis&Nbsp;  Verwenden Sie die CView-Klasse abgeleitet, weil es eine der Klassen in der Active Document-Server in die WM_COMMAND -Nachrichten-routing-Kette ist.

    klasse CMyServerView: öffentliche CView
    {
    geschützt: / / Erstellen von Serialisierung nur
    CMyServerView();
    DECLARE_DYNCREATE(CMyServerView)
    DECLARE_OLECMD_MAP()
    . . .
    }
    
  2. In der Implementierungsdatei für die CView-abgeleitete Klasse, fügen Sie die BEGIN_OLECMD_MAP und END_OLECMD_MAP Makros:
    BEGIN_OLECMD_MAP CMyServerView (CView)
    
    END_OLECMD_MAP()
    
  3. Fügen Sie den standard OLE print Befehl behandeln, einen ON_OLECMD -Makro Befehl Map angeben, die OLE-Befehls-ID für die standard-print-Befehl und ID_FILE_PRINT für die WM_COMMAND -ID. ID_FILE_PRINT ist der Standard, print-Befehl ID vom Anwendungs-Assistenten generierte MFC-Anwendungen verwendet:
    BEGIN_OLECMD_MAP CMyServerView (CView)
    ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

Beachten Sie, dass eines der standard OLE-Befehl-Makros, definiert in afxdocob.h, statt das ON_OLECMD -Makro verwendet werden könnten, da OLECMDID_PRINT ein standard OLE-Befehls-ID ist Das ON_OLECMD_PRINT -Makro wird die gleiche Aufgabe wie die oben gezeigten ON_OLECMD -Makro.

Wenn eine Containeranwendung dieses Servers durch IOleCommandTarget -Schnittstelle des Servers einen OLECMDID_PRINT -Befehl sendet, wird der MFC Druck Befehlshandler auf dem Server, wodurch des Servers die Anwendung Drucken aufgerufen werden. Die Active Document-Container Code zum Aufrufen des print-Befehls in die oben genannten Schritte hinzugefügt würde wie folgt aussehen:

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

HR = M_lpObject-Gt;QueryInterface (IID_IOleCommandTarget, Reinterpret_cast < Void ** >(&pCmd));
   if(failed(HR))
      Rückkehr;

HR = pCmd - > QueryStatus (NULL, 1, & Ocm, NULL);
   if(SUCCEEDED(HR) & & (ocm.cmdf & OLECMDF_ENABLED))
   {
      //Command ist verfügbar und aktiviert so nennen es
      COleVariant vIn;
      COleVariant vOut;
      HR = pCmd - > Exec (NULL, OLECMDID_PRINT,
 OLECMDEXECOPT_DODEFAULT, & vIn / vOut);
      Assert(SUCCEEDED(HR));
   }
   pCmd - > Release();
}

Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie

Index