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

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

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

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

  • 成员变量实现

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

  • 具有通知实现的成员变量

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

  • 获取/设置方法实现

    此实现由控件类中的一对成员函数组成。 当控件的用户请求属性的当前值时,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) 文件。

以下行将添加到 .用于声明两个调用 GetCircleOffset 函数的 H 文件,以及 SetCircleOffset

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)

最后,将控件的 GetCircleOffset 实现和 SetCircleOffset 函数添加到控件的末尾。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 类