本文介绍常见图片类型以及如何实现在 ActiveX 控件。 主题包括:
自定义图片属性的概述
在 ActiveX 控件中实现自定义属性图片
控件项目的添加
自定义图片属性的概述
图片类型是一组共有一些 ActiveX 控件的类型之一。 图片类型处理元文件、位图或图标并允许用户指定在 ActiveX 控件将显示的图片。 自定义图片属性使用图片对象实现并获取/设置函数允许控件用户访问图片属性。 使用加载图片属性页,控件用户可以访问自定义图片属性。
除了标准样式类型,字体和颜色类型也可用。 有关在 ActiveX 控件中使用标准字体的更多信息,请参见 MFC ActiveX 控件:使用字体文章。
ActiveX 控件类提供可用于实现在控件内图片属性的多个组件。 这些组件包含:
-
此类提供图片对象和功能为自定义图片属性显示的项的功能的便捷访问。
支持LPPICTUREDISP类型的属性,实现 get/set 函数。
使用类视图,您可以快速添加自定义属性或支持图片类型的属性。 添加有关使用类视图的 ActiveX 控件属性的更多信息,请参见文章 MFC ActiveX 控件:属性。
操作控件的图片属性或其他属性的属性页。
此属性页是常用属性页中可用的 ActiveX 控件的部分。 有关 ActiveX 控件属性页的更多信息,请参见文章 MFC ActiveX 控件:使用常用属性页
在 ActiveX 控件中实现自定义属性图片
在完成本节概述时的步骤时,控件显示用户选择的图像。 用户使用当前显示的图片属性页能够更改显示的图片,并可为用户选择不同的图片的浏览按钮。
自定义图片属性的实现类似于实现其他属性的进程,主要区别是自定义属性必须支持图片类型。 由于图片属性的项必须由 ActiveX 控件绘制,在完全实现前必须做出许多的添加和修改属行为。
若要实现自定义图片属性,必须执行以下操作:
将代码添加到控件项目中。
必须添加标准图片属性页 ID、CPictureHolder类型的数据成员和 LPPICTUREDISP 类型的自定义属性的 get/set 实现的。
修改控件类的多个函数。。
这些修改将对影响负责 ActiveX 控件的绘制的多个函数。
控件项目的添加
若要为标准图片属性页添加页属性 ID,请在控件的实现 (.cpp) 文件的 BEGIN_PROPPAGEIDS 宏后插入下面的行:
PROPPAGEID(CLSID_CPicturePropPage)
还必须增加 BEGIN_PROPPAGEIDS 宏的参数的计数。 下面的代码行阐释这一点:
BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)
若要向控件类添加 CPictureHolder 数据成员,在控件声明类的受保护节下的头文件(.H)中插入下列行:
CPictureHolder m_pic;
为数据成员 m_pic命名是不必要的;任意名称都可以。
接下来,添加支持图片类型的自定义属性:
使用添加属性向导,添加自图片属性定义
加载控件项目。
在类视图中,展开控件的库节点。
右击控件的接口节点 (库节点的第二个节点) ,打开快捷菜单。
从快捷菜单中单击**”添加“,然后单击“添加属性”**。
在**“属性名称”**框中键入属性的名称。 作为示例的目的,ControlPicture 使用此过程。
在 属性类型 框,为属性类型选择 IPictureDisp*。
对于 Implementation Type,单击 Get/Set Methods。
键入唯一名称 get 和 set 函数或接受默认名称。(在此例中,使用默认名称 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和自定义图片属性的 get/set 函数,在控件的实现文件中。(在此示例中调用控件类是 CSampleCtrl,CPictureHolder 数据成员是 m_pic,自定义图片属性名是 ControlPicture。)
在控件 OnResetState 函数,请在调用COleControl::OnResetState后添加下面的选项行:。
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();
在控件的自定义图片属性的 set 函数中,添加下列行:
m_pic.SetPictureDispatch(pVal);
InvalidateControl();
必须使图片属性不可变,以便在设计时添加的信息将出现在运行时。 下面一行添加到 COleControl派生类的 DoPropExchange 函数:
PX_Picture(pPX, _T("ControlPicture"), m_pic);
备注
类和函数名称可能与上面的示例不同。
修改完后,依次重新生成项目合并自定义图片属性的新功能和使用测试容器测试新属性。 有关如何访问测试容器的信息,请参见用测试容器测试属性和事件。