MFC ActiveX 控件:添加自定义属性

自定义属性不同于库存属性,该类尚未实现 COleControl 自定义属性。 自定义属性用于向使用控件的程序员公开 ActiveX 控件的特定状态或外观。

本文介绍如何使用“添加属性向导”将自定义属性添加到 ActiveX 控件,并说明生成的代码修改。 主题包括:

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

  • 成员变量实现

    此实现将属性的状态表示为控件类中的成员变量。 当属性值何时更改不重要时,请使用成员变量实现。 在三种类型中,此实现为属性创建最少的支持代码。 成员变量实现的调度映射入口宏是 DISP_PROPERTY

  • 带通知的成员变量实现

    此实现由“添加属性向导”创建的成员变量和通知函数组成。 属性值更改后框架会自动调用通知函数。 在属性值发生更改后需要通知时,请使用成员变量和通知实现。 此实现需要更多时间,因为它需要函数调用。 此实现的调度映射入口宏是 DISP_PROPERTY_NOTIFY

  • Get/Set 方法实现

    此实现由控件类中的一对成员函数组成。 当控件的用户请求属性的当前值时,Get/Set 方法实现会自动调用 Get 成员函数;当控件的用户请求更改属性时,Set 成员函数会自动调用 Get 成员函数。 当你需要在运行时计算属性的值、在改变实际属性之前验证控件用户传递的值,或者实现只读或只写的属性类型时,请使用此实现。 实现此功能的调度映射条目宏是 DISP_PROPERTY_EX。 以下部分 使用“添加属性向导”添加自定义属性,使用 CircleOffset 自定义属性来演示此实现。

  • 参数化实现

    添加属性向导支持参数化实现。 参数化属性(有时称为属性数组)可用于通过控件的单个属性访问一组值。 此实现的调度映射入口宏是 DISP_PROPERTY_PARAM。 有关实现此类型的详细信息,请参阅 ActiveX 控件:高级主题一文中的 “实现参数化属性 ”。

使用“添加属性向导”添加自定义属性

以下过程演示如何添加使用 Get/Set 方法实现的自定义属性 CircleOffset。 CircleOffset 自定义属性允许控件的用户从控件边框的中心偏移圆。 使用 Get/Set 方法以外的实现添加自定义属性的过程非常相似。

此过程还可用于添加所需的其他自定义属性。 将自定义属性名称替换为 CircleOffset 属性名称和参数。

使用“添加属性向导”添加 CircleOffset 自定义属性

  1. 加载控件的项目。

  2. 在“类视图”中,展开控件的库节点。

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

  4. 在快捷菜单中,单击“ 添加 ”,然后单击“ 添加属性”。

    这将打开 “添加属性向导”。

  5. “属性名称 ”框中,键入 CircleOffset

  6. 对于 实现类型,请单击 “获取/设置方法”。

  7. “属性类型” 框中,选择 short

  8. 键入 Get 和 Set Functions 的唯一名称,或接受默认名称。

  9. 单击“完成”。

“添加属性向导”为自定义属性做出的更改

添加 CircleOffset 自定义属性时,添加属性向导会修改控件类的头文件 (.H) 和实现文件 (.CPP)。

以下行将被添加到 .H 文件中,以声明两个函数,分别命名为 GetCircleOffsetSetCircleOffset

SHORT GetCircleOffset(void);
void SetCircleOffset(SHORT newVal);

以下行已被添加到控件的 .IDL 文件中:

[id(2), helpstring("property CircleOffset")] SHORT CircleOffset;
[id(3), helpstring("property MyProperty")] SHORT MyProperty;

此行将为 CircleOffset 属性分配一个特定的 ID 编号,该编号取自方法在“添加属性向导”的方法和属性列表中的位置。

此外,以下代码行将被添加到控件类的 .CPP 文件中的调度映射中,以将 CircleOffset 属性映射到控件的两个处理程序函数:

DISP_PROPERTY_EX_ID(CMyAxUICtrl, "CircleOffset", dispidCircleOffset, GetCircleOffset, SetCircleOffset, VT_I2)

最后,将GetCircleOffsetSetCircleOffset函数的实现添加到控件的.CPP文件末尾。 在大多数情况下,将修改 Get 函数以返回属性的值。 Set 函数通常包含应在属性更改之前或之后执行的代码。

void CMyAxUICtrl::SetCircleOffset(SHORT /*newVal*/)
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());

   // TODO: Add your property handler code here

   SetModifiedFlag();
}

请注意,“添加属性向导”会自动将对 SetModifiedFlag 的调用添加到 Set 函数的主体中。 调用此函数会将控件标记为已修改。 如果控件已修改,则保存容器时将保存其新状态。 每当属性保存为控件持久状态的一部分更改值时,都应调用此函数。

另请参阅

MFC ActiveX 控件
MFC ActiveX 控件:属性
MFC ActiveX 控件:方法
COleControl 类