本文介绍常见的图片类型以及如何在 ActiveX 控件中实现它。 主题包括:
自定义图片属性概述
图片类型是某些 ActiveX 控件通用的一组类型之一。 图片类型处理图元文件、位图或图标,并允许用户指定要在 ActiveX 控件中显示的图片。 自定义图片属性是使用图片对象和 Get/Set 函数实现的,这些函数允许控件用户访问 Picture 属性。 使用“图片”属性页控制用户访问自定义图片属性。
除了标准图片类型之外,字体和颜色类型也可用。 有关在 ActiveX 控件中使用标准字体类型的详细信息,请参阅 MFC ActiveX 控件:使用字体的文章。
ActiveX 控件类提供了多个组件,可用于在控件中实现 Picture 属性。 这些组件包括:
-
此类提供对自定义 Picture 属性所显示的项的图片对象和功能的轻松访问。
支持使用 Get/Set 函数实现的 LPPICTUREDISP 类型的属性。
使用类视图,可以快速添加支持图片类型的自定义属性或属性。 有关使用类视图添加 ActiveX 控件属性的详细信息,请参阅 MFC ActiveX 控件:属性一文。
用于作控件的 Picture 属性或属性的属性页。
此属性页是 ActiveX 控件可用的一组股票属性页的一部分。 有关 ActiveX 控件属性页的详细信息,请参阅 MFC ActiveX 控件:使用股票属性页一文
在 ActiveX 控件中实现自定义图片属性
完成本部分中概述的步骤后,控件可以显示其用户选择的图片。 用户可以使用显示当前图片的属性页更改显示的图片,并具有“浏览”按钮,允许用户选择不同的图片。
自定义图片属性是使用类似于实现其他属性的过程实现的,主要区别在于自定义属性必须支持图片类型。 由于 Picture 属性的项必须由 ActiveX 控件绘制,因此必须先对属性进行多次添加和修改,然后才能完全实现该属性。
若要实现自定义图片属性,必须执行以下作:
-
必须添加标准图片属性页 ID、类型
CPictureHolder
数据成员和具有 Get/Set 实现的 LPPICTUREDISP 类型的自定义属性。 -
这些修改将对负责绘制 ActiveX 控件的多个函数进行。
向控件项目添加内容
若要添加标准图片属性页的属性页 ID,请在控件实现文件中的BEGIN_PROPPAGEIDS宏后面插入以下行()。CPP):
PROPPAGEID(CLSID_CPicturePropPage)
还必须将BEGIN_PROPPAGEIDS宏的 count 参数递增一个。 以下行说明了这一点:
BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)
若要将数据 CPictureHolder
成员添加到控件类,请在控件头文件中控件类声明的受保护节下插入以下行()。H):
CPictureHolder m_pic;
无需 m_pic命名数据成员;任何名称都足以满足要求。
接下来,添加支持图片类型的自定义属性:
使用“添加属性向导”添加自定义图片属性
加载控件的项目。
在类视图中,展开控件的库节点。
右键单击控件(库节点的第二个节点)的接口节点以打开快捷菜单。
从快捷菜单中选择 “添加 ”,然后选择 “添加属性”。
在 “属性名称 ”框中,键入属性名称。 例如,
ControlPicture
此过程使用。在 “属性类型” 框中,选择属性类型的 IPictureDisp* 。
对于 实现类型,请单击 “获取/设置方法”。
键入 Get 和 Set Functions 的唯一名称,或接受默认名称。 (在此示例中,使用默认名称
GetControlPicture
。SetControlPicture
)单击“完成”。
“添加属性向导”在控件标头中的调度映射注释之间添加以下代码(。H) 文件:
IPictureDisp* GetControlPicture(void);
void SetControlPicture(IPictureDisp* pVal);
此外,在控件实现的调度映射中插入了以下代码(。CPP) 文件:
DISP_PROPERTY_EX_ID(CMyAxPicCtrl, "ControlPicture", dispidControlPicture,
GetControlPicture, SetControlPicture, VT_PICTURE)
“添加属性向导”还会在控件实现文件中添加以下两个存根函数:
IPictureDisp* CWizardGenCtrl::GetControlPicture(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your dispatch handler code here
return NULL;
}
void CWizardGenCtrl::SetControlPicture(IPictureDisp* /*pVal*/)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your property handler code here
SetModifiedFlag();
}
注释
控件类和函数名称可能与上面的示例不同。
对控件项目的修改
对控件项目进行必要的添加后,需要修改影响 ActiveX 控件呈现的多个函数。 这些函数 OnResetState
和 OnDraw
自定义 Picture 属性的 Get/Set 函数位于控件实现文件中。 (请注意,在此示例中调用 CSampleCtrl
控件类,数据 CPictureHolder
成员称为 m_pic,自定义图片属性名称为 ControlPicture
.)
在控件 OnResetState
函数中,在调用 COleControl::OnResetState
后添加以下可选行:
m_pic.CreateEmpty();
m_pic.CreateEmpty();
这会将控件的图片设置为空白图片。
若要正确绘制图片,请调用控件OnDraw
函数中的 CPictureHolder::Render。 修改函数,使其类似于以下示例:
void CMyAxPicCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
m_pic.Render(pdc, rcBounds, rcBounds);
}
在控件的自定义图片属性的 Get 函数中,添加以下行:
return m_pic.GetPictureDispatch();
return m_pic.GetPictureDispatch();
在控件的自定义 Picture 属性的 Set 函数中,添加以下行:
m_pic.SetPictureDispatch(pVal);
InvalidateControl();
图片属性必须持久化,以便设计时添加的信息将在运行时显示。 将以下行添加到 COleControl
-derived 类的 DoPropExchange
函数:
PX_Picture(pPX, _T("ControlPicture"), m_pic);
注释
类和函数名称可能与上面的示例不同。
完成修改后,重新生成项目以合并自定义图片属性的新功能,并使用测试容器测试新属性。 请参阅 使用测试容器测试属性和事件 了解有关如何访问测试容器的信息。