ActiveX控件的MFC设计之旅-第14步 .

在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也随之改变。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...