ActiveX控件属性的下拉列表

news/2024/11/24 7:24:57/

1、给控件类加上IPerPropertyBrowsingImpl接口

public IPerPropertyBrowsingImpl

在BEGIN_COM_MAP/END_COM_MAP()中间加上

COM_INTERFACE_ENTRY_IMPL(IPerPropertyBrowsing)

2、 在该类中添加下列函数

(A)STDMETHOD(MapPropertyToPage)(DISPID dispid, CLSID *pClsid);
(B)STDMETHOD(GetPredefinedStrings)(DISPID dispid, CALPOLESTR *pCaStringOut, CADWORD *pCaCookiesOut);
(C)STDMETHOD(GetPredefinedValue)(DISPID dispid, DWORD dwCookie, VARIANT *pVarOut);
(D) STDMETHOD(GetDisplayString)(DISPID dispid, BSTR *pBstr);

STDMETHODIMP CCameraCtrl::MapPropertyToPage(DISPID dispid, CLSID *pClsid)
{
    switch (dispid)
    {
    case dispidDeviceSource:
        return E_NOTIMPL; // 如果要自己实现下拉列表则返回E_NOIMPL
    default:
        break;
    }
    return IPerPropertyBrowsingImpl<CCameraCtrl>::MapPropertyToPage(dispid, pClsid);
}


STDMETHODIMP CCameraCtrl::GetPredefinedStrings(DISPID dispid, CALPOLESTR *pCaStringOut, CADWORD *pCaCookiesOut)
{
    USES_CONVERSION;
    HRESULT hr = S_OK;

    if ((NULL == pCaStringOut) || (NULL == pCaCookiesOut))
    {
        return E_POINTER;
    }

    if (dispid == dispidDeviceSource)
    {
        ULONG ulElems = 3;
        pCaStringOut->pElems = (LPOLESTR*)::CoTaskMemAlloc(sizeof(LPOLESTR) * ulElems);
        if (NULL == pCaStringOut->pElems)
        {
            return E_OUTOFMEMORY;
        }
       
        pCaCookiesOut->pElems = (DWORD*)::CoTaskMemAlloc(sizeof(DWORD*) * ulElems);
        if (NULL == pCaCookiesOut->pElems)
        {
            CoTaskMemFree(pCaStringOut->pElems);
            return E_OUTOFMEMORY;
        }
       
        pCaStringOut->cElems = ulElems;
        pCaCookiesOut->cElems = ulElems;

        char *szName[3] = {"Device0", "Device1", "Device2"};

        pCaStringOut->pElems[0] = ATLA2WHELPER((LPWSTR)::CoTaskMemAlloc((sizeof(szName[0]) + 1) * 2), szName[0], lstrlen(szName[0]) + 1);
        pCaStringOut->pElems[1] = ATLA2WHELPER((LPWSTR)::CoTaskMemAlloc((sizeof(szName[0]) + 1) * 2), szName[1], lstrlen(szName[1]) + 1);
        pCaStringOut->pElems[2] = ATLA2WHELPER((LPWSTR)::CoTaskMemAlloc((sizeof(szName[0]) + 1) * 2), szName[2], lstrlen(szName[2]) + 1);

        pCaCookiesOut->pElems[0] = 0;
        pCaCookiesOut->pElems[1] = 1;
        pCaCookiesOut->pElems[2] = 2;
   
        hr = S_OK;
    }

    return hr;
}


STDMETHODIMP CCameraCtrl::GetPredefinedValue(DISPID dispid, DWORD dwCookie, VARIANT *pVarOut)
{
    BOOL bResult = FALSE;

    switch (dispid)
    {
    case dispidDeviceSource:
        VariantInit(pVarOut);
        pVarOut->vt = VT_I4;
        pVarOut->lVal = dwCookie;
        bResult = TRUE;
        break;
    default:
        break;
    }

    return bResult;
}


STDMETHODIMP CCameraCtrl::GetDisplayString(DISPID dispid, BSTR *pBstr)
{
    USES_CONVERSION;
    HRESULT hr = S_FALSE;

    switch (dispid)
    {
    case dispidDeviceSource:
        switch (m_lDeviceSource)
        {
        case 0:
            *pBstr = ::SysAllocString(T2OLE("Device0"));
            break;
        case 1:
            *pBstr = ::SysAllocString(T2OLE("Device1"));
            break;
        case 2:
            *pBstr = ::SysAllocString(T2OLE("Device2"));
            break;
        default:
            break;
        }
        hr = S_OK;
        break;
    default:
        break;
    }

    return hr;
}


http://www.ppmy.cn/news/706074.html

相关文章

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

在VB和类似的包容器在属性视图中显示控件的属性&#xff0c;特别是枚举类型的属性时&#xff0c;会有一个下拉按钮&#xff0c;当点击该按钮时&#xff0c;会弹出一个列表框&#xff0c;显示一些友好的文字&#xff0c;供用户选择。而对于某些特殊的属性&#xff0c;如字体等&a…

OPM中细节设置

OPM中提供属性分类 常规的使用如下方法 BEGIN_OPMPROP_MAP() OPMPROP_ENTRY(0, DispID, PROPCAT_Data,0, 0, 0, “”, 0, 1, IID_NULL, IID_NULL, “”) END_OPMPROP_MAP() 其中DispIDP是R属性的 显示ID&#xff1b;OPCAT_为前缀的就是已经预定义的属性分类&#xff0c;其数值…

cad考试题库绘图题答案_CAD考试试题库和参考答案解析

CAD WORD资料.可编辑 CAD考试试题库及参考答案 一、单项选择 1、AUTOCAD的坐标体系,包括世界坐标和( D )坐标系。 A、绝对坐标 B、平面坐标 C、相对坐标 D、用户坐标 2、当进入了AUTOCAD环境中(即AUTOCAD的图形编辑器)时,缺省时所建立的坐标系统为( B ) A、用户坐标系 B、世界…

ObjectARX自定义对象的OPM

在AutoCAD绘图工作中&#xff0c;经常用到特性面板&#xff0c;它可以方便地查询、修改CAD对象的详细信息&#xff0c;如颜色、线型等&#xff0c;它是一个非常实用且便捷的工具。如果能为自定义对象添加一个特性面板&#xff08;OPM&#xff09;,这无疑是众多初学者极感兴趣的…

cesium时间轴格式化为北京时间

中心思想&#xff1a;使用JulianDate.addHours()方法&#xff0c;将时间8. 效果&#xff1a; 初始配置&#xff1a;创建viewer时打开时间轴的配置&#xff08;默认打开&#xff09;&#xff0c;动画配置shouleAnimate为true。 // timeline: false, // animation: false, shou…

高压线路零序电流方向保护程序逻辑原理(三)

四、零序保护故障处理程序原理 零序保护逻辑程序可分为三个模块&#xff1a;快速动作部分、全相循环和非全相循环模块。这是根据零序保护的特点而设计的。任何一种高压线路保护都要求快速处理I段范围内的严重故障&#xff0c;所以零序保护与距离保护一样配有快速动作部分程序模…

一卡通管理系统需求分析

一卡通管理系统需求分析业务需求 1&#xff0e;业务目的&#xff1a;将校园的各类消费与身份认证功能集成在一卡通&#xff0c;实现“一卡在手&#xff0c;走遍校园”。为在校的师生和教学管理人员提供具有开放性的、灵活性的管理平台。 2&#xff0e;业务目标&#xff1a;实现…

0602 信用卡防盗刷学习总结

前言 国内出境游高企,为了方便游客,很多银行都推出了支持境外消费的信用卡。然而,近年来卡未离身却遭遇境外网上盗刷的案件呈高发态势,其原因在于国外信用卡网上消费的验证程序与国内不同,像亚马逊、eBay等国外电商,其网络消费仅需信用卡卡号及卡片背面的CVV2码(签名档…