TN071: implementacja interfejsu MFC IOleCommandTarget
[!UWAGA]
Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.
IOleCommandTarget Interfejs umożliwia obiektów i ich pojemniki na wysyłanie poleceń do siebie nawzajem.Na przykład obiekt paski narzędzi mogą zawierać przyciski dla poleceń takich jak wydruku, Podgląd wydruku, zapisać, New, i Powiększenie.Jeśli taki obiekt zostały osadzone w kontenerze, który obsługuje IOleCommandTarget, umożliwiającą jej przyciski i polecenia służące do kontenera do przetwarzania, gdy użytkownik kliknie je przekazywać obiekt.Jeśli kontener chciał Aby wydrukować sam obiekt osadzony, może złożyć taki wniosek wysyłając polecenie za IOleCommandTarget interfejsu obiekt osadzony.
IOleCommandTargetInterfejs automatyzacji jak jest, że jest używany przez klienta do wywołania metody na serwerze.Jednak za pomocą IOleCommandTarget zapisuje obciążenie związane z wywołań za pośrednictwem interfejsów automatyzacji, ponieważ programiści nie trzeba używać zazwyczaj drogie Invoke metody IDispatch.
W bibliotece MFC IOleCommandTarget interfejs jest używany przez serwery aktywnego dokumentu, aby umożliwić kontenerów aktywnego dokumentu do wysłania polecenia do serwera.Klasa serwera aktywnego dokumentu, CDocObjectServerItem, wykorzystuje mapy interfejs MFC (zobacz TN038: wdrożenie IUnknown MFC/OLE) do wdrożenia IOleCommandTarget interfejsu.
IOleCommandTargetjest również implementowana w COleFrameHook klasy.COleFrameHook nieudokumentowanych klasy MFC, która implementuje funkcjonalność okna ramki w miejsce edytuje kontenerów.COleFrameHook również wykorzystuje mapy interfejs MFC do wdrożenia IOleCommandTarget interfejsu.COleFrameHookw realizacji IOleCommandTarget przekazuje polecenia OLE COleDocObjectItem-pochodnych kontenerów aktywnego dokumentu.Dzięki temu każdy MFC Active kontener dokumentu do odbierania wiadomości z serwerów zamkniętego aktywnego dokumentu.
Mapy polecenia OLE MFC
MFC deweloperzy mogą korzystać z IOleCommandTarget za pomocą MFC OLE polecenia map.Mapy polecenia OLE są jak wiadomość maps, ponieważ może być stosowany do mapowania poleceń OLE funkcji elementów członkowskich klasy, który zawiera mapę polecenia.Prace te należy umieścić na mapie polecenia, aby określić grupy poleceń OLE polecenia mają być obsługiwane, polecenie OLE i identyfikator polecenia makra WM_COMMAND wiadomość, która zostanie wysłana po odebraniu polecenia OLE.MFC udostępnia szereg predefiniowanych makr dla standardowych poleceń OLE.Aby uzyskać listę standardowego obiektu OLE poleceń, które zostały początkowo zaprojektowane dla korzystać z aplikacji Microsoft Office, zobacz wyliczenie OLECMDID, która jest zdefiniowana w docobj.h.
Po odebraniu polecenia OLE aplikacji MFC, która zawiera mapę polecenia OLE, MFC próbuje znaleźć identyfikator polecenia i grupy poleceń dla żądanej na mapie polecenia OLE aplikacji.Jeśli zostanie znaleziony, WM_COMMAND wiadomości jest wysyłane do aplikacji zawierającej mapę polecenia z Identyfikatorem żądane polecenie. (Zobacz opis ON_OLECMD poniżej.) W ten sposób OLE polecenia wysyłane do aplikacji są przekształcane w WM_COMMAND wiadomości według MFC.WM_COMMAND następnie Routing wiadomości za pośrednictwem aplikacji mapy wiadomości przy użyciu standardu MFC polecenia routingu architektury.
W przeciwieństwie do mapy wiadomości mapy MFC OLE polecenia nie są obsługiwane przez ClassWizard.Deweloperzy MFC trzeba dodać ręcznie polecenia obsługi map i wpisów map polecenia OLE.OLE polecenia map mogą być dodawane do biblioteki MFC aktywnych serwerów dokumentu w dowolnej klasy, która znajduje się w WM_COMMAND łańcucha przesyłanie wiadomości w czasie aktywny dokument jest aktywny w miejscu w pojemniku.Klasy te oferują pochodną klasy aplikacji CWinApp, CView, CDocument, i COleIPFrameWnd.W pojemnikach aktywnego dokumentu OLE polecenia map mogą być dodawane tylko do COleDocObjectItem-klasy.Ponadto, w pojemnikach aktywnego dokumentu WM_COMMAND wiadomości będą wysyłane tylko do mapy wiadomości w COleDocObjectItem-klasy.
Makra mapę polecenia OLE
Umożliwia dodanie funkcji mapowania poleceń do swojej klasy następujące makra:
DECLARE_OLECMD_MAP ()
To makro przechodzi w deklaracji klasy (zwykle w pliku nagłówka) Klasa, która zawiera mapę polecenia.
BEGIN_OLECMD_MAP(theClass, baseClass)
theClass
Nazwa klasy, który zawiera mapę polecenia.baseClass
Nazwa klasy podstawowej klasy, który zawiera mapę polecenia.
To makro oznacza początek mapy polecenia.Używanie tego makra w pliku implementacji dla klasy zawierającej mapę polecenia.
END_OLECMD_MAP()
To makro oznacza koniec polecenia map.Używanie tego makra w pliku implementacji dla klasy zawierającej mapę polecenia.To makro należy zawsze przestrzegać BEGIN_OLECMD_MAP makro.
ON_OLECMD(pguid, olecmdid, id)
pguid
Wskaźnik identyfikator GUID grupy poleceń polecenia OLE.Ten parametr jest wartości NULL dla grupy polecenia standard OLE.olecmdid
Identyfikator polecenia OLE polecenia do wywołania.id
Identyfikator WM_COMMAND komunikat do wysłania do aplikacji zawierającej mapę polecenie to polecenie OLE jest wywoływana.
Użycie ON_OLECMD polecenia makra na mapie polecenia, aby dodać wpisy na OLE mają być obsługiwane.Po odebraniu polecenia OLE, zostaną one przekonwertowane na określony WM_COMMAND wiadomość i przesyłane za pośrednictwem aplikacji mapy wiadomości przy użyciu standardowej architektury polecenia routingu MFC.
Przykład
Poniższy przykład pokazuje, jak dodać funkcję obsługi polecenia OLE do MFC aktywnego dokumentu serwera do obsługi OLECMDID_PRINT polecenia OLE.W przykładzie założono, że AppWizard użyty do wygenerowania aplikacji MFC, która jest serwer aktywnego dokumentu.
W swojej CView-pochodnych nagłówek klasy plików, dodać DECLARE_OLECMD_MAP makro do deklaracji klasy.
[!UWAGA]
Użycie CView-pochodnych klasy, ponieważ jest to jeden z klas w serwer aktywnego dokumentu, znajdujący się w WM_COMMAND łańcucha routingu wiadomości.
class CMyServerView : public CView { protected: // create from serialization only CMyServerView(); DECLARE_DYNCREATE(CMyServerView) DECLARE_OLECMD_MAP() . . . };
W pliku implementacji dla CView-klasy, dodać BEGIN_OLECMD_MAP i END_OLECMD_MAP makra:
BEGIN_OLECMD_MAP(CMyServerView, CView) END_OLECMD_MAP()
Aby obsługiwać standard OLE polecenia print, dodać ON_OLECMD makra do polecenia mapy określając identyfikator polecenia OLE dla standardowego polecenia drukowania i ID_FILE_PRINT dla WM_COMMAND identyfikatora.ID_FILE_PRINT jest standardowym polecenia print identyfikator używany przez aplikacje MFC AppWizard generowane:
BEGIN_OLECMD_MAP(CMyServerView, CView) ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT) END_OLECMD_MAP()
Należy zauważyć, że jedna standardowych makr polecenia OLE zdefiniowane w afxdocob.h, może być stosowana zamiast ON_OLECMD makro bo OLECMDID_PRINT jest standardowy identyfikator polecenia OLE.ON_OLECMD_PRINT Makro będzie wykonać to samo zadanie ON_OLECMD makro pokazanym powyżej.
Kiedy aplikacja kontenera wysyła ten serwer OLECMDID_PRINT polecenia żądania do serwera IOleCommandTarget interfejsu MFC drukowania program obsługi poleceń zostanie wywołany z serwera, powodując, że serwer drukowania aplikacji.Kod pojemnika aktywnego dokumentu do wywołania polecenia print dodane w powyższych kroków będzie wyglądać mniej więcej tak:
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();
}