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
, New
Save
ve Zoom
gibi Print
komutlar için düğmeler içerebilir. Böyle bir nesne destekleyen IOleCommandTarget
bir 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 IDispatch
kullanması 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ı, CDocObjectServerItem
arabirimi 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 COleDocObjectItem
iletir. 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 COleDocObjectItem
gö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.
Türetilmiş sınıfınızın
CView
üst bilgi dosyasında DECLARE_OLECMD_MAP makroyu sınıf bildirimine ekleyin.Dekont
CView
WM_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() // . . . };
Türetilmiş sınıfın
CView
uygulama dosyasına BEGIN_OLECMD_MAP ve END_OLECMD_MAP makrolarını ekleyin:BEGIN_OLECMD_MAP(CMyServerView, CView) END_OLECMD_MAP()
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();
}