在很多场合下会存在这样的需求,那就是使用方在实际使用控件之前就想控件已经做了相应的处理比如加载的控件版本不正确等,或者需要在加载时才确定能够使用的功能集;这个时候传统的配置文件已经无法满足这种类型的需求了,往往的做法是在初始化控件的时候即做了相应的初始化,然后对自身的功能做了限制或者给使用方反馈,所以常常看到的是html标签中出现这样的写法:

  1. <OBJECT id="UsbossViewer" name="objocx"
  2. classid="clsid:6F82C754-6C31-43EA-9818-E95AD4E872FC"
  3. width="100%" height="250">
  4. <PARAM NAME="restrictedAgent" VALUE="1"/>
  5. Ming-WebReport viewer has not be installed properly.</OBJECT>

除了往常的初始化发现多了这一行:

  1. <PARAM NAME="restrictedAgent" VALUE="1"/>

这是什么呢?就是接下来要介绍的控件的自定义属性。

自定义属性与常用属性的区别在于,自定义属性未由 COleControl 类实现。自定义属性用于将 ActiveX 控件的某个状态或外观向使用该控件的程序员公开。

自定义属性有四种实现类型:“成员变量”、“带通知的成员变量”、“Get/Set 方法”和“参数化”。

  • “成员变量”实现

    这种实现将属性的状态表示为控件类中的成员变量。当对于控件而言,知道属性值何时更改并不重要时,使用“成员变量”实现。在这三种类型中,这种实现为属性创建的支持代码量最少。成员变量实现的调度映射项宏为 DISP_PROPERTY。

  • “带通知的成员变量”实现

    这种实现由一个成员变量和一个由“添加属性向导”创建的通知函数组成。属性值更改后,框架将自动调用这个通知函数。当需要在属性值更改后得到通知时,使用“带通知的成员变量”实现。由于这种实现需要调用一个函数,因此需要较长的时间。这种实现的调度映射项宏为 DISP_PROPERTY_NOTIFY。

  • “Get/Set 方法”实现

    这种实现由控件类中的一对成员函数组成。当控件用户请求属性的当前值时“Get/Set 方法”实现自动调用 Get 成员函数,而当控件用户请求更改属性值时自动调用 Set 成员函数。当需要在运行时计算属性值、在更改实际属性之前验证控件用户传递的值或实现只读或只写属性类型时,使用这种实现。这种实现的调度映射项宏为DISP_PROPERTY_EX。

  • “参数化”实现

    “添加属性向导”支持参数化实现。参数化属性(有时称为属性数组)可用于通过控件的单个属性访问一组值。这种实现的调度映射项宏为 DISP_PROPERTY_PARAM

下面介绍最常用的成员变量的实现,至于其它三种方式在以后会做介绍:

(1)首先加载控件的项目

(2)在“类视图”中展开控件的库节点

(3)右击控件的接口节点(库节点的第二个节点)打开快捷菜单

(4)单击“添加属性”进入属性向导

命名属性名,选择类型,此外的名字会自动生成

(5)单击完成,这时会在Idl文件自动生成相应的属性

同时自动生成相应的成员变量

(6)这个时候就可以使用这个变量了,在按照文章开头的方式传入值,咦~~你会发现初始化的属性并没有传入到该成员变量中,并没有达到预期的效果,为什么呢?

原因很简单,就是没有做属性的持久化,关于这个关键的详细解释这里就不做展开了,你要做的是是在Ctrl文件中DoPropExchange方法调用PX_方法:

  1. void CCCEACtrl::DoPropExchange(CPropExchange* pPX)
  2. {
  3. ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
  4. COleControl::DoPropExchange(pPX);
  5. // TODO: 为每个持久的自定义属性调用 PX_ 函数。
  6. PX_String(pPX, "restrictedAgent", m_restrictedAgent, "0");
  7. PX_String(pPX, "GetLoginInterfaceID", m_GetLoginInterfaceID, "0");
  8. }

这时最基础的属性框架已经OK了,该属性可以正常地使用了。

【VS开发】ActiveX控件如何定制属性?的更多相关文章

  1. 用C#开发ActiveX控件,并使用web调用

    入职差不多两个月了,由学生慢慢向职场人做转变,也慢慢的积累知识,不断的更新自己.最近的一个项目里边,涉及到的一些问题,因为SDK提供的只是winform才能使用了,但是有需求咱们必须得完成啊,所以涉及 ...

  2. 使用C#开发ActiveX控件(新)

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  3. [转]C#开发ActiveX控件,.NET开发OCX控件案例

    引自:百度   http://hi.baidu.com/yanzuoguang/blog/item/fe11974edf52873aaec3ab42.html 讲下什么是ActiveX控件,到底有什么 ...

  4. 使用C#开发ActiveX控件(新) 转 http://www.cnblogs.com/yilin/p/csharp-activex.html

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  5. [转] 使用C#开发ActiveX控件

    双魂人生 原文 使用C#开发ActiveX控件 ActiveX 是一个开放的集成平台,为开发人员.用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内 ...

  6. 使用C#开发ActiveX控件 11

    C#开发ActiveX控件   ActiveX 是一个开放的集成平台,为开发人员.用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内容的方法. 使用 ...

  7. C#开发ActiveX控件

    昨天写了篇博客<Winform 程序嵌入WPF程序 并发送消息>,没有说明为什么要嵌入WPF程序,那么今天就来唠叨唠叨其中的一个使用场景,开发ActiveX控件 首先,新建一个类库工程Hu ...

  8. 使用C#开发ActiveX控件

    使用C#开发ActiveX控件(新) 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动 ...

  9. [转]使用C#开发ActiveX控件全攻略

    前言: 这段时间因为工作的需要,研究了一下ActiveX控件.总结如下: 先说说ActiveX的基本概念. 根据微软权威的软件开发指南MSDN(Microsoft Developer Network) ...

随机推荐

  1. gulp 自动化构建网站(版本号静态资源)

    前言 新的一年啦,感觉总是静不下心,用了一天的时间吧,算是对gulp 这个前端打包工具入门了,自己也写了demo,表示对这个稍微理解了吧, 当然还是有差距的啦,下面讲讲怎么用吧: 如何用 当然先去官网 ...

  2. OpenCV笔记(3)(Canny边缘检测、高斯金字塔、拉普拉斯金字塔、图像轮廓、模板匹配)

    一.Canny边缘检测 Canny边缘检测是一系列方法综合的结果.其中主要包含以下步骤: 1.使用高斯滤波器,平滑图像,滤除噪声. 2.计算图像中每个像素点的梯度强度和方向. 3.应用非极大值抑制(N ...

  3. javascript中的原型和原型链(二)

    原型(prototype) 函数的 prototype 属性(图) 每个函数都有一个prototype属性,它默认指向一个Object空对象(即称为:原型对象) 原型对象中有一个属性construct ...

  4. windows下kafka配置入门 示例

    实验平台与软件: 操作系统:windows7 32  位 java 开发包: jdk1.8.0_144 集群: zookeeper-3.3.6 消息队列: kafka_2.11-0.11.0.1 安装 ...

  5. unittest详解(三) 测试套件(TestSuite)

    在前面一章中示例了如何编写一个简单的测试,但有两个问题: 我们知道测试用例的执行顺序是根据测试用例名称顺序执行的,在不改变用例名称的情况下,我们怎么来控制用例执行的顺序呢? 一个测试文件,我们直接执行 ...

  6. hdu 4763 看毛片(单纯next数组的应用--纯正O(n))

    因为需要负责队内的字符串题,开始刷,做到这道,开始想不出来,上网找题解, 然后就惊了,为什么你们这么暴力都可以过的啊,1e6啊,后来又想了下会做了 贴下代码 #include <iostream ...

  7. JavaBean,EJB,POJO,Spring Bean 的演进历程

    JavaBean Sun公司对类提出的规范:1,类是public的2,有一个无参构造方法3,属性修饰要用private,通过get set操作4,实现Serializable接口5,对事件使用Swin ...

  8. redis-sentinel 主从复制高可用

    Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端 ...

  9. SSH三大框架整合配置详解

    首先,三大框架整合,肯定是要导入相当多的jar包,这是不容置疑的!     这里就不一一列举了,直接截图吧:             (1) 基于配置文件的整合:        第一步:我们需要在we ...

  10. 类组件(Class component)和函数式组件(Functional component)之间有何不同

    类组件不仅允许你使用更多额外的功能,如组件自身的状态和生命周期钩子,也能使组件直接访问 store 并维持状态当组件仅是接收 props,并将组件自身渲染到页面时,该组件就是一个 ‘无状态组件(sta ...