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

自定义属性与常用属性的不同之处在于,自定义属性尚未由 COleControl 类实现。 自定义属性用于向使用控件的程序员公开 ActiveX 控件的特定状态或外观。

本文介绍如何使用“添加属性向导”将自定义属性添加到 ActiveX 控件,并阐释了由此导致的代码修改。 主题包括:

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

  • 成员变量实现

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

  • 带通知的成员变量实现

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

  • Get/Set 方法实现

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

  • 参数化实现

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

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

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

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

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

  1. 加载控件的项目。

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

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

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

    这会打开添加属性向导

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

  6. 对于“实现类型”,请单击“Get/Set 方法”

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

  8. 为 Get 和 Set 函数键入唯一名称或接受默认名称。

  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();
}

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

另请参阅

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