在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, "Visible", dwDispID)){
COleDispatchDriver PropDispDriver;
PropDispDriver.AttachDispatch(lpdisp, FALSE);
PropDispDriver.SetProperty(dwDispID, VT_BOOL, 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", dwDispID)){
COleDispatchDriver PropDispDriver;
PropDispDriver.AttachDispatch(lpdisp, FALSE);
PropDispDriver.GetProperty(dwDispID, 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, "Tag", dwDispID)){
COleDispatchDriver PropDispDriver;
PropDispDriver.AttachDispatch(lpdisp, FALSE);
CString str = lpszNewValue;
PropDispDriver.SetProperty(dwDispID, VT_BSTR, 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", dwDispID)){
COleDispatchDriver PropDispDriver;
PropDispDriver.AttachDispatch(lpdisp, FALSE);
PropDispDriver.GetProperty(dwDispID, VT_BSTR, &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, "Name", dwDispID)){
COleDispatchDriver PropDispDriver;
PropDispDriver.AttachDispatch(lpdisp, FALSE);
CString str = lpszNewValue;
PropDispDriver.SetProperty(dwDispID, VT_BSTR, 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, 0, (long*)&dwDispID));
}
3.在VB中添加控件测试可以发现,改变Visible,Tag和Name属性,MyVisible,MyTag和MyName也随之改变。
阅读(1979) | 评论(0) | 转发(0) |