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

要添加这种功能,你必须实现 IPerPropertyBrowsing接口,

 typedef struct tagCALPOLESTR {            ULONG cElems;            OLECHAR ** pElems;} CALPOLESTR;

typedef struct tagCADWORD {            ULONG cElems;            DWORD * pElems;} CADWORD;

interface IPerPropertyBrowsing : IUnknown{  HRESULT GetDisplayString(DISPID dispid, BSTR * lpbstr);  HRESULT MapPropertyToPage(DISPID dispid, CLSID *lpclsid);  HRESULT GetPredefinedStrings(DISPID dispid, CALPOLESTR *lpcasz,                                CADWORD *lpcadw);  HRESULT GetPredefinedValue(DISPID dispid, DWORD dwCookie,                             VARIANT *lpvarOut);}

幸运的是,在用MFC设计ActiveX控件时,COleControl已经帮我们实现了这个接口,我们只需要重载COleControl的一些函数就可以实现我们所需要的功能了。这些函数是
    virtual BOOL OnGetDisplayString(DISPID dispid, CString& strValue);
    virtual BOOL OnGetPredefinedStrings(DISPID dispid, CStringArray* pStringArray, CDWordArray* pCookieArray);
    virtual BOOL OnGetPredefinedValue(DISPID dispid, DWORD dwCookie, VARIANT* lpvarOut);
    virtual BOOL OnMapPropertyToPage(DISPID dispid, LPCLSID lpclsid, BOOL* pbPageOptional);

分别和IPerPropertyBrowsing的四个接口方法一一对应。其中,前三个就是用来显示友好文字的列表框式的属性设置的,最后一个则是用来显示属性页对话框式的属性设置的。

注:VB首先查询控件的IPerPropertyBrowsing接口,以获得一个属性的显示字符串。当查询失败时,如果可能的话,VB会装载类型库并找到在IDL文件中为这个属性指定的枚举值。如果再次失败,VB会显示实际属性值。

1.建立控件Tppb,添加属性long Week
2.添加连续的7个字符串资源
IDS_WEEK_MONDAY,IDS_WEEK_TUESDAY,......IDS_WEEK_SUNDAY;
相应的字符串分别是
星期一,星期二,......星期日。
3.重载OnGetDisplayString,OnGetPredefinedStrings和OnGetPredefinedValue。

BOOL CTppbCtrl::OnGetDisplayString(DISPID dispid, CString& strValue)
{
    // TODO: Add your specialized code here and/or call the base class
    if(dispid == dispidWeek){
        strValue.LoadString(IDS_WEEK_MONDAY+m_week);
        return TRUE;
    }
    return COleControl::OnGetDisplayString(dispid, strValue);
}

BOOL CTppbCtrl::OnGetPredefinedStrings(DISPID dispid, CStringArray* pStringArray, CDWordArray* pCookieArray)
{
    // TODO: Add your specialized code here and/or call the base class
    if(dispid == dispidWeek){
        for(int i=0; i<7; i++){
            CString str;
            str.LoadString(IDS_WEEK_MONDAY+i);
            pStringArray->Add(str);
            pCookieArray->Add(i);
        }
        return TRUE;
    }
    return COleControl::OnGetPredefinedStrings(dispid, pStringArray, pCookieArray);
}

BOOL CTppbCtrl::OnGetPredefinedValue(DISPID dispid, DWORD dwCookie, VARIANT* lpvarOut)
{
    // TODO: Add your specialized code here and/or call the base class
    if(dispid == dispidWeek){
        VariantInit(lpvarOut);
        lpvarOut->vt = VT_I4;
        //和dwCookie一一对应,0号位值就是0,......,6号位的值就是6
        lpvarOut->lVal = dwCookie;
        return TRUE;
    }
    return COleControl::OnGetPredefinedValue(dispid, dwCookie, lpvarOut);
}

4.在VB中测试就可以看到Week属性会列出从星期一到星期日共七个选项的列表选择框。

5.添加属性long Param和固有属性Caption

6.新建一属性页(资源为IDD_PROPPAGE_TEST,类为CTestPropPage),属性页中只有一个编辑框IDC_EDIT_CAPTION,和固有属性Caption关联。(新建属性页的步骤不详述,请参考本系列其它文章)

7.重载OnMapPropertyToPage以在设置Param属性时显示对话框

BOOL CTppbCtrl::OnMapPropertyToPage(DISPID dispid, LPCLSID lpclsid, BOOL* pbPageOptional)
{
    // TODO: Add your specialized code here and/or call the base class
    if(dispid == dispidParam){
        *lpclsid = CTestPropPage::guid;
        *pbPageOptional = TRUE;
        return TRUE;
    }
    return COleControl::OnMapPropertyToPage(dispid, lpclsid, pbPageOptional);
}
注:为什么不在属性页中设置Param属性,而是Caption属性呢,主要是想解释一下,从哪个属性设置中弹出属性页和在该属性页中设置哪个属性并无关联,你也可以在弹出的属性页对话框中设置多个属性。

8.简单修饰一下控件,为控件添加一些初始值

void CTppbCtrl::OnResetState()
{
    COleControl::OnResetState();  // Resets defaults found in DoPropExchange

// TODO: Reset any other control state here.
    m_week = 0;
    m_param = 0;
}

9.可以在VB下测试了

ActiveX控件的MFC设计之旅-第15步相关推荐

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

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

  2. ActiveX控件的MFC实现(VS2017,OpenGL)

    文章目录 1.简介 2.代码编写 3.注册控件 4.结果运行 后记 1.简介 ActiveX 控件是允许网站提供视频和游戏等内容的小应用. 浏览 Web 时,你也可以使用这些小应用与工具栏和股票代码等 ...

  3. 使用MFC开发ActiveX控件

    摘要: 本文对COM组件中的ActiveX控件的MFC开发方法进行了介绍,讲述了用户自定义和库存属性.方法以及事件的添加方法和属性页的制作过程.使读者能够掌握基本的MFC ActiveX开发方法. 前 ...

  4. mfc随记:基于vs2010创建MFC ActiveX控件并测试

    一.新建一个空项目 以管理员打开vs2010,选择新建一个mfc activeX控件,填写项目名称和路径,其他无需修改,直接默认一直下一步即可 二. 添加测试方法 在底部tab栏切换到类视图,右键添加 ...

  5. 基于MFC的ActiveX控件开发

    转自:http://www.cnblogs.com/lidabo/archive/2012/12/04/2800921.html ActiveX 控件是基于组件对象模型 (COM) 的可重用软件组件, ...

  6. MFC的ActiveX控件 - 1

    转自:https://blog.csdn.net/babykangaroo/article/details/45795079 本文是入门学习ActiveX的学习笔记,属于系统学习整个框架部分,具体细节 ...

  7. VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件

    VS2008 在IE8中 调试 ActiveX控件 无法进入断点的解决方法 设置VS2008和IE8 调试ATL MFC ActiveX控件 参考文章: (1)VS2008 在IE8中 调试 Acti ...

  8. MFC ActiveX控件的3种调用方式

    导读 1.导入ActiveX控件,拖放ActiveX控件方式 2.动态创建ActiveX控件 3.COM调用方式 1.导入ActiveX控件,拖放ActiveX控件方式 1.工具箱添加ActiveX控 ...

  9. VS2005下MFC开发的ActiveX控件的部分总结 inf 篇

    本博客转载CSDN网友http://blog.csdn.net/immc1979/archive/2007/04/20/1572222.aspx,本人觉得写得非常的实在,一看就是从实际经验中总结出来的 ...

最新文章

  1. Python学习之While--break
  2. linux离线安装python3 devel_linux离线安装python3
  3. 在阿里云里申请免费Https证书SSL
  4. Kubernetes 在知名互联网公司的(dotnet)落地实践
  5. 如何把word分装到两个byte_如何核对两个Word文档的内容差别?同事加班半小时,我只花了30秒...
  6. NS2仿真分析无线网络的攻击防御(2)
  7. 【Python】画一个心形
  8. js中in关键字的用法
  9. C#指南,重温基础,展望远方!(8)C#数组
  10. [Python3] 017 字典的内置方法
  11. AGV机器人(1)基于视觉避障的理论基础
  12. java项目飞机大战
  13. 视频二维码在线生成器怎么用?
  14. nmap扫描mysql弱口令_弱口令检测和端口扫描
  15. 计算机知识培训感言,关于计算机培训心得体会
  16. 百业升级 共启新程——CDEC2021中国数字智能生态大会武汉站今日举行
  17. 读书笔记-人月神话2
  18. [逆向工具] 详解pbtk解析steam中的protobuf协议
  19. 虚拟服务器面板,主流的虚拟主机控制面板有哪些(一)
  20. git fatal: unable to access  Failed to connect to localhost port 1080: Connection refused

热门文章

  1. 【tools】信息收集-灯塔资产扫描 ARL
  2. CommonAPI使用例子-HelloWorld
  3. 笔试中怎么答产品设计类题目
  4. 一站放心购全球:亚马逊海外购开启2022年黑五全球购物季
  5. eclipse web插件配置方法(tomcat10 也可解决)
  6. Windows系统的电脑有可以删除的文件夹(个人笔记)
  7. php 显示时间动态效果,使用h5 canvas实现时钟的动态效果
  8. 镜像电流源特点_镜像电流源电路.ppt
  9. 基础: 有效值、RMS、振幅、幅度概念
  10. Flutter 发布iOS版本app