Udostępnij za pośrednictwem


TN071: implementacja interfejsu MFC IOleCommandTarget

Uwaga

Następująca uwaga techniczna nie została zaktualizowana, ponieważ została po raz pierwszy uwzględniona w dokumentacji online. W związku z tym niektóre procedury i tematy mogą być nieaktualne lub nieprawidłowe. Aby uzyskać najnowsze informacje, zaleca się wyszukanie interesującego tematu w indeksie dokumentacji online.

Interfejs IOleCommandTarget umożliwia obiektom i ich kontenerom wysyłanie poleceń do siebie. Na przykład paski narzędzi obiektu mogą zawierać przyciski poleceń, takich jak Print, , Print PreviewSave, Newi Zoom. Jeśli taki obiekt został osadzony w kontenerze, który obsługuje IOleCommandTarget, obiekt może włączyć jego przyciski i przekazać polecenia do kontenera do przetwarzania po kliknięciu przez użytkownika. Jeśli kontener chce, aby obiekt osadzony wydrukował się, może wysłać to żądanie, wysyłając polecenie za pośrednictwem IOleCommandTarget interfejsu obiektu osadzonego.

IOleCommandTarget jest interfejsem przypominającym automatyzację, który jest używany przez klienta do wywoływania metod na serwerze. Jednak użycie metody IOleCommandTarget pozwala zaoszczędzić nakład pracy związany z wykonywaniem wywołań za pośrednictwem interfejsów automatyzacji, ponieważ programiści nie muszą używać zwykle kosztownej IDispatchInvoke metody .

W MFC IOleCommandTarget interfejs jest używany przez serwery dokumentów aktywnych, aby umożliwić kontenerom dokumentów aktywnych wysyłanie poleceń do serwera. Klasa CDocObjectServerItemserwera active document używa map interfejsu MFC (zobacz TN038: MFC/OLE IUnknown Implementation) w celu zaimplementowania interfejsu IOleCommandTarget .

IOleCommandTarget jest również implementowany w COleFrameHook klasie . COleFrameHook to nieudokumentowana klasa MFC, która implementuje funkcjonalność okna ramowego kontenerów edycji w miejscu. COleFrameHook Używa również map interfejsu MFC w celu zaimplementowania interfejsu IOleCommandTarget . COleFrameHookImplementacja poleceń OLE jest przekazywana IOleCommandTarget do COleDocObjectItemkontenerów dokumentów aktywnych pochodnych. Dzięki temu każdy kontener dokumentów aktywnych MFC może odbierać komunikaty z zawartych serwerów dokumentów aktywnych.

Mapy poleceń MFC OLE

Deweloperzy MFC mogą korzystać z map IOleCommandTarget poleceń MFC OLE. Mapy poleceń OLE są podobne do map komunikatów, ponieważ mogą służyć do mapowania poleceń OLE na funkcje składowe klasy zawierającej mapę poleceń. Aby wykonać tę pracę, umieść makra na mapie poleceń, aby określić grupę poleceń OLE, którą chcesz obsłużyć, polecenie OLE i identyfikator polecenia komunikatu WM_COMMAND , który zostanie wysłany po odebraniu polecenia OLE. MFC udostępnia również wiele wstępnie zdefiniowanych makr dla standardowych poleceń OLE. Aby uzyskać listę standardowych poleceń OLE, które zostały pierwotnie zaprojektowane do użytku z usługą Microsoft aplikacja pakietu Office lications, zobacz wyliczenie OLECMDID zdefiniowane w pliku docobj.h.

Po odebraniu polecenia OLE przez aplikację MFC zawierającą mapę poleceń OLE, MFC próbuje znaleźć identyfikator polecenia i grupę poleceń dla żądanego polecenia na mapie poleceń OLE aplikacji. W przypadku znalezienia dopasowania do aplikacji zostanie wysłany komunikat WM_COMMAND zawierający mapę poleceń z identyfikatorem żądanego polecenia. (Zobacz opis ON_OLECMD poniżej). W ten sposób polecenia OLE wysyłane do aplikacji są przekształcane w komunikaty WM_COMMAND przez MFC. Komunikaty WM_COMMAND są następnie kierowane przez mapy komunikatów aplikacji przy użyciu standardowej architektury routingu poleceń MFC.

W przeciwieństwie do map komunikatów mapy poleceń MFC OLE nie są obsługiwane przez klasę ClassWizard. Deweloperzy MFC muszą ręcznie dodać obsługę map poleceń OLE i wpisy mapy poleceń OLE. Mapy poleceń OLE można dodać do serwerów dokumentów aktywnych MFC w dowolnej klasie, która znajduje się w łańcuchu routingu komunikatów WM_COMMAND w momencie, gdy aktywny dokument jest aktywny w kontenerze. Te klasy obejmują klasy aplikacji pochodzące z CWinApp, CView, CDocument i COleIPFrameWnd. W kontenerach dokumentów aktywnych mapy poleceń OLE można dodawać tylko do klasy pochodnej COleDocObjectItem. Ponadto w kontenerach dokumentów aktywnych komunikaty WM_COMMAND będą wysyłane tylko do mapy komunikatów w klasie -pochodnej COleDocObjectItem.

Makra mapy poleceń OLE

Użyj następujących makr, aby dodać funkcje mapy poleceń do klasy:

DECLARE_OLECMD_MAP ()

To makro znajduje się w deklaracji klasy (zazwyczaj w pliku nagłówkowym) klasy zawierającej mapę poleceń.

BEGIN_OLECMD_MAP(theClass, baseClass)

theClass
Nazwa klasy zawierającej mapę poleceń.

Baseclass
Nazwa klasy bazowej klasy zawierającej mapę poleceń.

To makro oznacza początek mapy poleceń. Użyj tego makra w pliku implementacji dla klasy zawierającej mapę poleceń.

END_OLECMD_MAP()

To makro oznacza koniec mapy poleceń. Użyj tego makra w pliku implementacji dla klasy zawierającej mapę poleceń. To makro musi zawsze być zgodne z makrem BEGIN_OLECMD_MAP.

ON_OLECMD(pguid, olecmdid, id)

pguid
Wskaźnik do identyfikatora GUID grupy poleceń OLE polecenia. Ten parametr ma wartość NULL dla standardowej grupy poleceń OLE.

olecmdid
Identyfikator polecenia OLE polecenia do wywołania.

id
Identyfikator komunikatu WM_COMMAND, który ma zostać wysłany do aplikacji zawierającej mapę poleceń po wywołaniu tego polecenia OLE.

Użyj makra ON_OLECMD na mapie poleceń, aby dodać wpisy dla poleceń OLE, które chcesz obsłużyć. Po odebraniu poleceń OLE zostaną one przekonwertowane na określony komunikat WM_COMMAND i kierowane przez mapę komunikatów aplikacji przy użyciu standardowej architektury routingu poleceń MFC.

Przykład

W poniższym przykładzie pokazano, jak dodać funkcję obsługi poleceń OLE do serwera dokumentów Active MFC w celu obsługi OLECMDID_PRINT polecenia OLE. W tym przykładzie przyjęto założenie, że użyto aplikacji AppWizard do wygenerowania aplikacji MFC, która jest aktywnym serwerem dokumentów.

  1. CViewW pliku nagłówkowym klasy pochodnej dodaj makro DECLARE_OLECMD_MAP do deklaracji klasy.

    Uwaga

    Użyj klasy -pochodnej CView, ponieważ jest to jedna z klas na serwerze dokumentów Active, który znajduje się w łańcuchu routingu komunikatów WM_COMMAND.

    class CMyServerView : public CView
    {
    protected: // create from serialization only
        CMyServerView();
        DECLARE_DYNCREATE(CMyServerView)
        DECLARE_OLECMD_MAP()
        // . . .
    };
    
  2. W pliku implementacji klasy pochodnej CViewdodaj makra BEGIN_OLECMD_MAP i END_OLECMD_MAP:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Aby obsłużyć standardowe polecenie drukowania OLE, dodaj makro ON_OLECMD do mapy poleceń, określając identyfikator polecenia OLE dla standardowego polecenia drukowania i ID_FILE_PRINT dla identyfikatora WM_COMMAND. ID_FILE_PRINT to standardowy identyfikator polecenia drukowania używany przez aplikacje MFC wygenerowane przez aplikację AppWizard:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
        ON_OLECMD(NULL, OLECMDID_PRINT, ID_FILE_PRINT)
    END_OLECMD_MAP()
    

Należy pamiętać, że jedno ze standardowych makr poleceń OLE zdefiniowanych w pliku afxdocob.h może być używane zamiast makra ON_OLECMD, ponieważ OLECMDID_PRINT jest standardowym identyfikatorem polecenia OLE. Makro ON_OLECMD_PRINT wykona to samo zadanie co makro ON_OLECMD pokazane powyżej.

Gdy aplikacja kontenera wysyła temu serwerowi polecenie OLECMDID_PRINT za pośrednictwem interfejsu serwera IOleCommandTarget , program obsługi poleceń drukowania MFC zostanie wywołany na serwerze, co spowoduje wyświetlenie aplikacji przez serwer. Kod kontenera dokumentów aktywnych w celu wywołania polecenia drukowania 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->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();
}

Zobacz też

Uwagi techniczne według numerów
Uwagi techniczne według kategorii