Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192804
  • 博文数量: 90
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 0
  • 用 户 组: 普通用户
  • 注册时间: 2017-08-23 16:48
文章分类

全部博文(90)

文章存档

2015年(1)

2011年(21)

2010年(59)

2009年(9)

我的朋友

分类: C/C++

2010-07-14 10:18:08

在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) |
给主人留下些什么吧!~~