TN071: mfc IOleCommandTarget uygulanması

IOleCommandTarget arabirimi nesneleri ve onların kapsayıcıları komutları birbirine gönderme etkinleştirir. Örneğin, bir nesnenin araç çubukları düğmeler için baskı, Baskı Önizleme, kaydetmek, Yenive yakınlaştırmagibi komutları içerebilir. Böyle bir nesne IOleCommandTargetdestekleyen bir kap içinde gömülü, nesne onun düğmeleri etkinleştirmek ve komutları işlemek için kullanıcı bunları tıklatıldığında kabına iletmek. Kendisini yazdırmak için katıştırılmış nesnenin bir kapsayıcı istedim, bu istek katıştırılmış nesneyi IOleCommandTarget arabirimi üzerinden komut göndererek ebil yapmak o.

İstemci tarafından bir sunucuda yöntemlerini çağırmak için kullanılır ki, IOleCommandTarget otomasyon gibi bir arabirimdir. Ancak, programcılar IDispatch genellikle pahalı Invoke yöntemi kullanmak zorunda değilsiniz çünkü Otomasyon arabirimleri arama yapma yükü IOleCommandTarget kullanarak kaydeder.

Mfc içinde komutları sunucuya gönderme etkin belge konteynerler izin vermek için etkin belgeyi sunucuları tarafından IOleCommandTarget arabirimi kullanılır. Etkin belge sunucu sınıfı, CDocObjectServerItem, mfc arabirimi haritalar kullanır (bkz: TN038: mfc/ole IUnknown uygulama) IOleCommandTarget arabirimini uygulayan.

IOleCommandTarget da COleFrameHook sınıfında uygulanmaktadır. COleFrameHook yerinde düzenleme kapsayıcı çerçeve penceresi işlevselliğini uygulayan, belgesiz bir mfc sınıfıdır. COleFrameHook mfc arabirimi haritalar IOleCommandTarget arabirimini uygulamak için de kullanır. IOleCommandTarget COleFrameHook' nın uygulanması, COleDocObjectItemiçin ole komutları iletir-etkin belge konteynerler türetilmiş. Bu içerdiği etkin belge sunucularından gelen iletileri almak herhangi bir mfc etkin belge kapsayıcı sağlar.

Mfc ole komutu eşlemeleri

Mfc geliştiriciler IOleCommandTarget mfc ole komutu eşlemeleri kullanarak yararlanabilirsiniz. Çünkü ole komutları komut harita içeren sınıf üye işlevlerine eşleştirmek için kullanılabilir ileti haritalar gibi ole komut haritalar bulunmaktadır. Bu işi yapmak için makroları ele almak istediğiniz komutu, ole komutu ve komut Kımlığı ole komut grubunu belirtmek için komut harita yer ole komutu alındığında gönderilecek wm_command iletisi. mfc ayrıca önceden tanımlı makroları için standart ole komutları sunar. Standart ole listesi komutları için tasarlanan Microsoft Office uygulamaları ile docobj.h içinde tanımlanan OLECMDID numaralandırma bakın.

Bir ole komutunu bir ole komutunu göster içeren bir mfc uygulaması tarafından alındığında, mfc için uygulama ole komut Haritası istenen komut komut kimliği ve komut grubu bulmayı dener. Bir eşleşme bulunursa, istenen komut Kımlığı ile komut eşlemeyi içeren uygulama wm_command ileti gönderilir. (Bkz. on_olecmd aşağıda açıklaması.) Bu şekilde, ole komutları uygulamaya gönderilir wm_command mesajlara mfc tarafından etkinleştirilir. wm_command iletileri daha sonra mfc standart uygulamanın iletiyi haritalar yönlendirilir mimari Yönlendirme komutu.

İleti haritalar, mfc ole komut haritalar ClassWizard tarafından desteklenmez. mfc geliştiriciler ole komut harita desteği ve ole komutu eşleme girdilerini el ile eklemeniz gerekir. ole wm_command zincir ileti yönlendirme sırasında etkin belge olan herhangi bir sınıf mfc etkin belge sunucularına haritalar eklenebilir yerinde etkin bir komuttur. Bu sınıflar, CWinApp, CView, CDocumentve COleIPFrameWnd' den uygulama sınıfları içerir. Etkin belgeyi kaplarda ole komutu eşlemeleri yalnızca COleDocObjectItemiçin eklenebilir-türetilmiş sınıf. Ayrıca, etkin belgeyi kaplarda wm_command iletileri yalnızca COleDocObjectItemileti harita için dağıtılması-türetilmiş sınıf.

Ole komutunu göster makrolar

Komut göster işlevi, sınıfa eklemek için aşağıdaki makroları kullanma:

DECLARE_OLECMD_MAP)

Bu makro komutu harita içeren sınıf (üstbilgi dosyasında genellikle) sınıf bildirimi devam ediyor.

BEGIN_OLECMD_MAP (ardından, AnaSınıf)

ardından

Komut harita içeren sınıf adı.

anaSınıf

Komut harita içeren sınıf temel sınıfın adı.

Bu makro komutu harita başlangıcı işaretler. Bu makro komutu harita içeren sınıf uygulama dosyasını kullanın.

 END_OLECMD_MAP()

Bu makro komutu Haritası sonunu. Bu makro komutu harita içeren sınıf uygulama dosyasını kullanın. Bu makro her zaman izlemeniz gerekir BEGIN_OLECMD_MAP makro.

On_olecmd (pguid, olecmdid, ID)

pguid

Ole komutunun komut grubu GUID'si için işaretçi. Bu parametre null olduğu için standart ole komut grubu.

olecmdid

Ole çağırılacak komut Kımlığı komutu.

id

Bu ole komutu çalıştırıldığında komut eşlemeyi içeren uygulamaya gönderilmek üzere wm_command ileti Kımlığı.

Kullanım ON_OLECMD ole için girişleri eklemek için komut harita makro komutları işlemek istiyorum. ole komutlar aldığında, onlar için belirtilen wm_command ileti dönüştürülür ve komut yönlendirme standart mfc mimarisi kullanarak uygulamanın iletiyi harita yönlendirilir.

Örnek

Aşağıdaki örnek ole komut işleme yeteneği işlemek için bir mfc etkin belge sunucuya eklemek gösterilmiştir OLECMDID_PRINT ole komutu. Bu örnek, bir mfc uygulaması etkin belgeyi bir sunucu oluşturmak için AppWizard kullanılan varsayılmaktadır.

  1. İçinde senin CView-sınıfının üstbilgi türetilen dosya, eklemek DECLARE_OLECMD_MAP Sınıf bildirimindeki makro.

    &Notnbsp;CViewkullan- wm_command zincir ileti yönlendirme etkin belge sunucusu sınıfları biri olduğu için türetilmiş sınıf.

    cMyServerView sınıfı: Genel CView
    {
    Korumalı: / / dizileştirme yalnızca oluştur
    CMyServerView();
    DECLARE_DYNCREATE(CMyServerView)
    DECLARE_OLECMD_MAP()
    . . .
    }
    
  2. CViewuygulama dosyasında-türetilmiş sınıf, eklemek BEGIN_OLECMD_MAP ve END_OLECMD_MAP makrolar:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Standart ole print komutu işlemek için bir on_olecmd makro standart yazdırma komutu ole komut kimliği ve ID_FILE_PRINT wm_command kodu için belirtme komut harita ekleyin. ID_FILE_PRINT print komutunun ID AppWizard tarafından üretilen mfc uygulamaları tarafından kullanılan standarttır:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

OLECMDID_PRINT bir standart ole komut kimliği olduğundan afxdocob.h içinde tanımlanan standart ole komut makro, biri on_olecmd makro yerine kullanılabileceği Not ON_OLECMD_PRINT makro yukarıda gösterilen on_olecmd makro olarak aynı görevi gerçekleştirmek olacaktır.

Bir konteyner uygulaması sunucunun IOleCommandTarget arabirimi üzerinden OLECMDID_PRINT komut bu sunucunun gönderdiğinde, mfc baskı komut işleyici uygulamanın yazdırma sunucusunun neden sunucu, çağrılacak. Etkin belgeyi konteynerin kod yukarıdaki adımlarda eklenen print komutunu çağırmak için bu şöyle:

void CContainerCntrItem::DoOleCmd()
{
   IOleCommandTarget * pCmd = null;
   Hr hresult E_FAIL; =
   olecmd ocm = {OLECMDID_PRINT, 0};

hr = m_lpObject-gt;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 etkin ve kullanılabilir öylesine seslenmek o
      COleVariant vIn;
      COleVariant vOut;
      hr = pCmd - > Exec (null, OLECMDID_PRINT,
 olecmdexecopt_dodefault, vIn & vOut);
      ASSERT(succeeded(hr));
   }
   pCmd - > Release();
}

Teknik notlar numarasına göre |nbsp; Teknik notlar kategorisine göre

Index