在VB设计ActiveX控件时,UserControl可以访问容器提供的扩展对象Extender,比如VB,就提供了Visible,Tag,Name等等标准的扩展属性和ToolTipText等等其它扩展属性。
那么在用MFC设计ActiveX控件时,是否也能利用到这个扩展属性呢?
能,COleControl提供了一个函数LPdisPATCH GetExtendedControl()用来获得扩展对象的Idispatch接口。
注意:
容器并不一定要提供扩展对象,因此,GetExtendedControl也并不一定能返回有效的Idispatch接口,必须首先判断一下是否为NULL。 .继续用tppb作例子,我们测试三个扩展属性,Visible,Tag和Name 1.添加三个属性BOOl MyVisible,BSTR Tag,BSTR Name,都用get/set methods类型 2.通过获得扩展对象并访问扩展对象的属性来实现我们的这三个属性 BOOL CTppbCtrl::GetMyVisible() { // Todo: Add your property handler here BOOL b; disPID dwdispID; LPdisPATCH lpdisp = GetExtendedControl(); if(lpdisp && GetdispID(lpdisp,"Visible",dwdispID)){ COledispatchDriver PropdispDriver; PropdispDriver.Attachdispatch(lpdisp,FALSE); PropdispDriver.GetProperty(dwdispID,VT_BOOL,&b); PropdispDriver.Detachdispatch(); } if(lpdisp){ lpdisp->Release(); } return b; return TRUE; } void CTppbCtrl::SetMyVisible(BOOL bNewValue) { // Todo: Add your property handler here disPID dwdispID; LPdisPATCH lpdisp = GetExtendedControl(); if(lpdisp && GetdispID(lpdisp,FALSE); PropdispDriver.SetProperty(dwdispID,bNewValue); PropdispDriver.Detachdispatch(); } if(lpdisp){ lpdisp->Release(); } SetModifiedFlag(); } BSTR CTppbCtrl::Getmytag() { CString strResult; // Todo: Add your property handler here disPID dwdispID; LPdisPATCH lpdisp = GetExtendedControl(); if(lpdisp && GetdispID(lpdisp,"Tag",VT_BSTR,&strResult); PropdispDriver.Detachdispatch(); } if(lpdisp){ lpdisp->Release(); } return strResult.AllocSysstring(); } void CTppbCtrl::Setmytag(LPCTSTR lpszNewValue) { // Todo: Add your property handler here disPID dwdispID; LPdisPATCH lpdisp = GetExtendedControl(); if(lpdisp && GetdispID(lpdisp,FALSE); CString str = lpszNewValue; PropdispDriver.SetProperty(dwdispID,str); PropdispDriver.Detachdispatch(); } if(lpdisp){ lpdisp->Release(); } SetModifiedFlag(); } BSTR CTppbCtrl::GetMyName() { CString strResult; // Todo: Add your property handler here disPID dwdispID; LPdisPATCH lpdisp = GetExtendedControl(); if(lpdisp && GetdispID(lpdisp,"Name",&strResult); PropdispDriver.Detachdispatch(); } if(lpdisp){ lpdisp->Release(); } return strResult.AllocSysstring(); } void CTppbCtrl::SetMyName(LPCTSTR lpszNewValue) { // Todo: Add your property handler here disPID dwdispID; LPdisPATCH lpdisp = GetExtendedControl(); if(lpdisp && GetdispID(lpdisp,str); PropdispDriver.Detachdispatch(); } if(lpdisp){ lpdisp->Release(); } SetModifiedFlag(); } BOOL CTppbCtrl::GetdispID(LPdisPATCH pdisp,LPCTSTR lpszName,long& dwdispID) { USES_CONVERSION; LPCOLESTR lpOleStr = T2COLE(lpszName); return SUCCEEDED(pdisp->GetIDsOfNames(IID_NULL,(LPOLESTR*)&lpOleStr,1,(long*)&dwdispID)); } 3.在VB中添加控件测试可以发现,改变Visible,Tag和Name属性,MyVisible,mytag和MyName也随之改变。