Aracılığıyla paylaş


TN071: MFC IOleCommandTarget Uygulaması

Dekont

Aşağıdaki teknik not, çevrimiçi belgelere ilk kez eklendiğinden beri güncelleştirilmemiştir. Sonuç olarak, bazı yordamlar ve konular güncel olmayabilir veya yanlış olabilir. En son bilgiler için, çevrimiçi belge dizininde ilgilendiğiniz konuyu aramanız önerilir.

Arabirim, IOleCommandTarget nesnelerin ve kapsayıcılarının birbirine komut göndermesine olanak tanır. Örneğin, bir nesnenin araç çubukları , , Print Preview, NewSaveve Zoomgibi Printkomutlar için düğmeler içerebilir. Böyle bir nesne destekleyen IOleCommandTargetbir kapsayıcıya eklenmişse, nesne düğmelerini etkinleştirebilir ve kullanıcı tıkladığında komutları işlenmek üzere kapsayıcıya iletebilir. Bir kapsayıcı katıştırılmış nesnenin kendisini yazdırmasını istiyorsa, eklenmiş nesnenin IOleCommandTarget arabirimi aracılığıyla bir komut göndererek bu isteği yapabilir.

IOleCommandTarget , bir istemci tarafından bir sunucudaki yöntemleri çağırmak için kullanıldığı Otomasyon benzeri bir arabirimdir. Ancak programcıların IOleCommandTarget genellikle pahalı Invoke olan yöntemini IDispatchkullanması gerekmeyen otomasyon arabirimleri aracılığıyla çağrı yapma yükünden tasarruf sağlar.

MFC'de arabirim, IOleCommandTarget Etkin belge sunucuları tarafından Etkin belge kapsayıcılarının sunucuya komut göndermesine izin vermek için kullanılır. Etkin belge sunucusu sınıfı, CDocObjectServerItemarabirimi uygulamak IOleCommandTarget için MFC arabirim eşlemelerini kullanır (bkz. TN038: MFC/OLE IUnknown Uygulaması).

IOleCommandTarget sınıfında da uygulanır COleFrameHook . COleFrameHook , yerinde düzenleme kapsayıcılarının çerçeve penceresi işlevselliğini uygulayan belgelenmemiş bir MFC sınıfıdır. COleFrameHook ayrıca arabirimi uygulamak için MFC arabirim eşlemelerini IOleCommandTarget kullanır. COleFrameHook'nin uygulaması IOleCommandTarget OLE komutlarını türetilmiş Active belge kapsayıcılarına COleDocObjectItemiletir. Bu, tüm MFC Etkin belge kapsayıcılarının kapsanan Etkin belge sunucularından ileti almasına olanak tanır.

MFC OLE Komutu Haritalar

MFC geliştiricileri MFC OLE komut eşlemelerini kullanarak bu avantajdan IOleCommandTarget yararlanabilir. OLE komut eşlemeleri, OLE komutlarını komut eşlemesini içeren sınıfın üye işlevleriyle eşlemek için kullanılabildiğinden ileti eşlemeleri gibidir. Bunu yapmak için, işlemek istediğiniz komutun OLE komut grubunu, OLE komutunu ve OLE komutu alındığında gönderilecek WM_COMMAND iletisinin komut kimliğini belirtmek için komut eşlemesine makrolar yerleştirin. MFC ayrıca standart OLE komutları için önceden tanımlanmış bir dizi makro sağlar. Başlangıçta Microsoft Office uygulaması lications ile kullanılmak üzere tasarlanmış standart OLE komutlarının listesi için docobj.h dosyasında tanımlanan OLECMDID numaralandırması bölümüne bakın.

OLE komut eşlemesi içeren bir MFC uygulaması tarafından OLE komutu alındığında, MFC istenen komutun komut kimliğini ve komut grubunu uygulamanın OLE komut eşlemesinde bulmaya çalışır. Eşleşme bulunursa, istenen komutun kimliğine sahip komut eşlemesini içeren uygulamaya bir WM_COMMAND iletisi gönderilir. (Aşağıdaki açıklamaya ON_OLECMD bakın.) Bu şekilde, bir uygulamaya gönderilen OLE komutları MFC tarafından WM_COMMAND iletilere dönüştürülür. WM_COMMAND iletileri daha sonra MFC standart komut yönlendirme mimarisi kullanılarak uygulamanın ileti eşlemeleri aracılığıyla yönlendirilir.

İleti eşlemelerinin aksine, MFC OLE komut eşlemeleri ClassWizard tarafından desteklenmez. MFC geliştiricilerinin OLE komut eşlemesi desteği ve OLE komut eşlemesi girdilerini el ile eklemesi gerekir. OLE komut eşlemeleri, Etkin belge bir kapsayıcıda etkin olduğu sırada WM_COMMAND ileti yönlendirme zincirindeki herhangi bir sınıftaki MFC Etkin belge sunucularına eklenebilir. Bu sınıflar, uygulamanın CWinApp, CView, CDocument ve COleIPFrameWnd'dan türetilen sınıflarını içerir. Etkin belge kapsayıcılarında, OLE komut eşlemeleri yalnızca COleDocObjectItem türetilmiş sınıfına eklenebilir. Ayrıca, Etkin belge kapsayıcılarında, WM_COMMAND iletileri yalnızca -derived sınıfında ileti eşlemesine COleDocObjectItemgönderilir.

OLE Komut Eşleme Makroları

Sınıfınıza komut eşlemesi işlevselliği eklemek için aşağıdaki makroları kullanın:

DECLARE_OLECMD_MAP ()

Bu makro, komut eşlemesini içeren sınıfın sınıf bildirimine (genellikle üst bilgi dosyasında) gider.

BEGIN_OLECMD_MAP(theClass, baseClass)

theClass
Komut eşlemesini içeren sınıfın adı.

Baseclass
Komut eşlemesini içeren sınıfın temel sınıfının adı.

Bu makro, komut eşlemesinin başlangıcını işaretler. Bu makroyu, komut eşlemesini içeren sınıfın uygulama dosyasında kullanın.

END_OLECMD_MAP()

Bu makro, komut eşlemesinin sonunu işaretler. Bu makroyu, komut eşlemesini içeren sınıfın uygulama dosyasında kullanın. Bu makro her zaman BEGIN_OLECMD_MAP makroyu izlemelidir.

ON_OLECMD(pguid, olecmdid, id)

pguid
OLE komutunun komut grubunun GUID'sinin işaretçisi. Bu parametre, standart OLE komut grubu için NULL'tır.

olecmdid
Çağrılacak komutun OLE komut kimliği.

id
Bu OLE komutu çağrıldığında komut eşlemesini içeren uygulamaya gönderilecek WM_COMMAND iletisinin kimliği.

İşlemek istediğiniz OLE komutlarının girdilerini eklemek için komut eşlemesindeki ON_OLECMD makrosunu kullanın. OLE komutları alındığında, bunlar belirtilen WM_COMMAND iletisine dönüştürülür ve standart MFC komut yönlendirme mimarisi kullanılarak uygulamanın ileti eşlemesi aracılığıyla yönlendirilir.

Örnek

Aşağıdaki örnekte, OLECMDID_PRINT OLE komutunu işlemek için MFC Etkin belge sunucusuna OLE komut işleme özelliğinin nasıl ekleneceği gösterilmektedir. Bu örnekte, Etkin belge sunucusu olan bir MFC uygulaması oluşturmak için AppWizard kullandığınız varsayılır.

  1. Türetilmiş sınıfınızın CViewüst bilgi dosyasında DECLARE_OLECMD_MAP makroyu sınıf bildirimine ekleyin.

    Dekont

    CViewWM_COMMAND ileti yönlendirme zincirindeki Etkin belge sunucusundaki sınıflardan biri olduğundan türetilmiş sınıfını kullanın.

    class CMyServerView : public CView
    {
    protected: // create from serialization only
        CMyServerView();
        DECLARE_DYNCREATE(CMyServerView)
        DECLARE_OLECMD_MAP()
        // . . .
    };
    
  2. Türetilmiş sınıfın CViewuygulama dosyasına BEGIN_OLECMD_MAP ve END_OLECMD_MAP makrolarını ekleyin:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Standart OLE yazdırma komutunu işlemek için, komut eşlemesine standart yazdırma komutunun OLE komut kimliğini ve WM_COMMAND kimliği için ID_FILE_PRINT belirten bir ON_OLECMD makro ekleyin. ID_FILE_PRINT, AppWizard tarafından oluşturulan MFC uygulamaları tarafından kullanılan standart yazdırma komut kimliğidir:

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

OLECMDID_PRINT standart bir OLE komut kimliği olduğundan, afxdocob.h dosyasında tanımlanan standart OLE komut makrolarından birinin ON_OLECMD makro yerine kullanılabileceğini unutmayın. ON_OLECMD_PRINT makro, yukarıda gösterilen ON_OLECMD makroyla aynı görevi gerçekleştirir.

Bir kapsayıcı uygulaması bu sunucuya sunucunun IOleCommandTarget arabirimi aracılığıyla bir OLECMDID_PRINT komutu gönderdiğinde, sunucuda MFC yazdırma komut işleyicisi çağrılır ve sunucunun uygulamayı yazdırmasına neden olur. Yukarıdaki adımlarda eklenen yazdırma komutunu çağırmak için Etkin belge kapsayıcısının kodu şuna benzer olacaktır:

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();
}

Ayrıca bkz.

Sayıya Göre Teknik Notlar
Kategoriye Göre Teknik Notlar