自定义属性不同于库存属性,该类尚未实现 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 自定义属性
加载控件的项目。
在类视图中,展开控件的库节点。
右键单击控件(库节点的第二个节点)的接口节点以打开快捷菜单。
在快捷菜单中,单击“ 添加 ”,然后单击“ 添加属性”。
这将打开 “添加属性向导”。
在 “属性名称 ”框中,键入 CircleOffset。
对于 实现类型,请单击 “获取/设置方法”。
在 “属性类型” 框中,选择
short
。键入 Get 和 Set Functions 的唯一名称,或接受默认名称。
单击“完成”。
为自定义属性添加属性向导更改
添加 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 类