TN071: MFC IOleCommandTarget realizacji

Interfejs IOleCommandTarget umożliwia obiektów i ich pojemniki do wysyłania poleceń do siebie nawzajem. Na przykład obiekt paski narzędzi mogą zawierać przyciski poleceń takich jak Drukowanie, Podgląd wydruku, zapisać Nowyi Powiększenie. Jeśli taki obiekt zostały osadzone w pojemniku, który obsługuje IOleCommandTarget, obiekt może umożliwić jego przyciski i przesłać polecenia do kontenera dla przetwarzania, gdy użytkownik kliknie przycisk je. Jeśli kontener obiektu osadzonego do drukowania sam, może uczynić to żądanie wysyłając polecenie za pośrednictwem interfejsu IOleCommandTarget obiekt osadzony.

IOleCommandTarget jest interfejsu podobnego do automatyzacji, że jest on używany przez klienta do wywołania metody na serwerze. Jednakże przy użyciu IOleCommandTarget zapisuje narzutów wywołań za pośrednictwem interfejsów automatyzacji, ponieważ programiści nie trzeba używać najczęściej kosztownych metody Invoke interfejsu IDispatch.

W MFC interfejs IOleCommandTarget jest używany przez serwery aktywnego dokumentu umożliwia aktywnego dokumentu pojemniki do wysyłania poleceń do serwera. Aktywny dokument serwera klasy, CDocObjectServerItem, używa MFC interfejs map (zobacz TN038: MFC/OLE IUnknown wykonania) do implementować interfejs IOleCommandTarget.

IOleCommandTarget jest również implementowana w klasie COleFrameHook . COleFrameHook jest nieudokumentowane klasy MFC, który implementuje funkcję okno ramki kontenerów edycji w miejscu. COleFrameHook używa również MFC interfejs map do implementować interfejs IOleCommandTarget . COleFrameHookwykonania IOleCommandTarget przekazuje poleceń OLE COleDocObjectItem-pochodnych pojemniki aktywnego dokumentu. Dzięki temu każdy MFC Active pojemnik dokumentu do odbierania wiadomości z zamkniętego aktywnego dokumentu serwerów.

MFC OLE polecenie map

MFC deweloperzy mogą korzystać IOleCommandTarget za pomocą MFC OLE polecenia map. OLE polecenia mapy są jak wiadomości mapuje, ponieważ może być używany do mapowania OLE poleceń Funkcje składowe klasy, która zawiera mapę polecenia. Aby tej pracy, umieść makra na mapie polecenia, aby określić grupy polecenia OLE polecenia chcesz obsługiwać, polecenie OLE i identyfikator polecenia komunikat WM_COMMAND , który zostanie wysłany po odebraniu polecenia OLE. MFC udostępnia także szereg wstępnie zdefiniowane makra standardowe polecenia OLE. Listę standardowych OLE poleceń, które zostały początkowo zaprojektowanie do korzystania z aplikacji pakietu Microsoft Office, zobacz wyliczenie OLECMDID, która jest zdefiniowana w docobj.h.

Po odebraniu polecenia OLE przez aplikację MFC, który zawiera mapę polecenia OLE MFC próbuje znaleźć identyfikator polecenia i grupa poleceń dla żądanego polecenia w planie polecenia OLE aplikacji. Jeśli zostanie znaleziony odpowiednik, wiadomość WM_COMMAND jest wysyłane do aplikacji zawierający mapę polecenia z ID żądanego polecenia. (Zobacz opis ON_OLECMD poniżej). W ten sposób OLE poleceń wysyłane do aplikacji są włączone do WM_COMMAND wiadomości przez MFC. Wiadomości WM_COMMAND następnie przesyłane za pośrednictwem aplikacji komunikat mapy za pomocą standardu MFC polecenia routingu architektury.

W przeciwieństwie do wiadomości mapy MFC OLE polecenie map nie są obsługiwane przez ClassWizard. Deweloperzy MFC należy dodać ręcznie OLE polecenie Mapa wsparcia i OLE polecenie Mapa wpisów. OLE polecenia, które mapy mogą być dodawane do MFC aktywnych serwerów dokumentu w klasie, która jest w łańcuchu routowanie wiadomości WM_COMMAND w czasie aktywnego dokumentu jest aktywny w miejscu w pojemniku. Klasy te obejmują aplikacji klasy pochodzące od CWinApp, CView, CDocumenti COleIPFrameWnd. W aktywnym dokumencie pojemnikach, OLE polecenie map mogą być dodawane tylko do COleDocObjectItem-klasy. Ponadto w aktywnym dokumencie pojemnikach, wiadomości WM_COMMAND będzie tylko wysyłane do mapę wiadomości w COleDocObjectItem-klasy.

OLE polecenie Mapa makra

Użyj następujące makra, aby dodać polecenie Mapa funkcjonalności do swojej klasy:

(DECLARE_OLECMD_MAP)

To makro przechodzi w deklaracji klasy (zazwyczaj w pliku nagłówka) klasa, która zawiera mapę polecenia.

BEGIN_OLECMD_MAP (theClass, baseClass)

theClass

Nazwę klasy, która zawiera mapę polecenia.

baseClass

Nazwa klasy bazowej klasy, która zawiera mapę polecenia.

To makro oznacza początek mapę polecenia. Użyj tego makra w pliku implementacji klasy, która zawiera mapę polecenia.

 END_OLECMD_MAP()

Makro to znaki końca mapę polecenia. Użyj tego makra w pliku implementacji klasy, która zawiera mapę polecenia. Makro to zawsze przestrzegać BEGIN_OLECMD_MAP makro.

ON_OLECMD (pguid, olecmdid, identyfikator)

pguid

Wskaźnik na identyfikator GUID grupa poleceń polecenie OLE. Ten parametr ma wartość NULL dla standardowej grupy polecenia OLE.

olecmdid

OLE polecenia identyfikator polecenia do potrącenia.

identyfikator

Identyfikator komunikatu WM_COMMAND ma być wysłany do aplikacji zawierający mapę polecenia, gdy wywoływana jest to polecenie OLE.

Użycie ON_OLECMD makra na mapie polecenia, aby dodać wpisy dla OLE poleceń, aby obsłużyć. Po odebraniu polecenia OLE, będą one konwertowane na określoną wiadomość WM_COMMAND i kierowane przez mapę komunikat aplikacji za pomocą standardową architekturę routingu polecenia MFC.

Przykład

Poniższy przykład pokazuje, jak dodać funkcję obsługi polecenia OLE do MFC Active server dokumentu do obsługi OLECMDID_PRINT OLE polecenia. W tym przykładzie założono, że AppWizard użyty do wygenerowania Aplikacja MFC, który jest serwerem aktywnego dokumentu.

  1. W sieci CView-pochodnych klasy nagłówka pliku, dodać DECLARE_OLECMD_MAP makro do deklaracji klasy.

    Uwaganbsp;  Użyj CView-pochodnych klasy, ponieważ jest to jeden z klas w serwera aktywnego dokumentu, który jest w łańcuchu routowanie wiadomości WM_COMMA&ND.

    klasa CMyServerView: CView publicznych
    {
    chronione: / / create z serializacji tylko
    CMyServerView();
    DECLARE_DYNCREATE(CMyServerView)
    DECLARE_OLECMD_MAP()
    . . .
    }
    
  2. W pliku implementacji dla CView-klasy, dodać BEGIN_OLECMD_MAP i END_OLECMD_MAP makra:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Do obsługi standardowego polecenia drukowania OLE, makro ON_OLECMD należy dodać do mapy polecenia, określając identyfikator polecenia OLE dla standardowych poleceń drukowania i ID_FILE_PRINT dla identyfikatora WM_COMMAND . ID_FILE_PRINT jest standardowe polecenia drukowania identyfikator używany w aplikacjach MFC generowanych przez AppWizard:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

Uwaga, że jeden standardowy makr polecenia OLE, określonych w afxdocob.h, mogłyby można użyć zamiast makra ON_OLECMD , ponieważ OLECMDID_PRINT jest identyfikator polecenia standardowego OLE Makro ON_OLECMD_PRINT będzie wykonania tego samego zadania jako makra ON_OLECMD pokazanym powyżej.

Gdy aplikacja kontenera wysyła ten serwer polecenia OLECMDID_PRINT za pośrednictwem serwera IOleCommandTarget interfejsu, MFC obsługi polecenia drukowania zostanie wywołany na serwerze, zmuszenie serwera drukowania aplikacji. Kod kontenera aktywnego dokumentu do powoływania się na wydruku polecenia dodanego w powyższych krokach 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 BT;Funkcja QueryInterface (IID_IOleCommandTarget, reinterpret_cast < >(&pCmd) void **);
   if(FAILED(HR))
      powrotu;

hr = pCmd - > QueryStatus (NULL, 1 & ocm, NULL);
   if(SUCCEEDED(HR) & & (ocm.cmdf & OLECMDF_ENABLED))
   {
      //Command jest dostępny i włączone tak nazywasz
      COleVariant vIn;
      COleVariant vOut;
      hr = pCmd - > Exec (NULL, OLECMDID_PRINT,
 OLECMDEXECOPT_DODEFAULT & vIn & vOut);
      Assert(SUCCEEDED(HR));
   }
   pCmd - > Release();
}

Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii

Index