MFC ActiveX 控件:在 ActiveX 控件中使用图片

本文介绍常见的图片类型以及如何在 ActiveX 控件中实现它。 主题包括:

自定义图片属性概述

图片类型是某些 ActiveX 控件通用的一组类型之一。 图片类型处理图元文件、位图或图标,并允许用户指定要在 ActiveX 控件中显示的图片。 自定义图片属性是使用图片对象和 Get/Set 函数实现的,这些函数允许控件用户访问 Picture 属性。 使用“图片”属性页控制用户访问自定义图片属性。

除了标准图片类型之外,字体和颜色类型也可用。 有关在 ActiveX 控件中使用标准字体类型的详细信息,请参阅 MFC ActiveX 控件:使用字体的文章。

ActiveX 控件类提供了多个组件,可用于在控件中实现 Picture 属性。 这些组件包括:

  • CPictureHolder 类。

    此类提供对自定义 Picture 属性所显示的项的图片对象和功能的轻松访问。

  • 支持使用 Get/Set 函数实现的 LPPICTUREDISP 类型的属性。

    使用类视图,可以快速添加支持图片类型的自定义属性或属性。 有关使用类视图添加 ActiveX 控件属性的详细信息,请参阅 MFC ActiveX 控件:属性一文。

  • 用于作控件的 Picture 属性或属性的属性页。

    此属性页是 ActiveX 控件可用的一组股票属性页的一部分。 有关 ActiveX 控件属性页的详细信息,请参阅 MFC ActiveX 控件:使用股票属性页一文

在 ActiveX 控件中实现自定义图片属性

完成本部分中概述的步骤后,控件可以显示其用户选择的图片。 用户可以使用显示当前图片的属性页更改显示的图片,并具有“浏览”按钮,允许用户选择不同的图片。

自定义图片属性是使用类似于实现其他属性的过程实现的,主要区别在于自定义属性必须支持图片类型。 由于 Picture 属性的项必须由 ActiveX 控件绘制,因此必须先对属性进行多次添加和修改,然后才能完全实现该属性。

若要实现自定义图片属性,必须执行以下作:

向控件项目添加内容

若要添加标准图片属性页的属性页 ID,请在控件实现文件中的BEGIN_PROPPAGEIDS宏后面插入以下行()。CPP):

PROPPAGEID(CLSID_CPicturePropPage)

还必须将BEGIN_PROPPAGEIDS宏的 count 参数递增一个。 以下行说明了这一点:

BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)

若要将数据 CPictureHolder 成员添加到控件类,请在控件头文件中控件类声明的受保护节下插入以下行()。H):

CPictureHolder    m_pic;

无需 m_pic命名数据成员;任何名称都足以满足要求。

接下来,添加支持图片类型的自定义属性:

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

  1. 加载控件的项目。

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

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

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

  5. “属性名称 ”框中,键入属性名称。 例如, ControlPicture 此过程使用。

  6. “属性类型” 框中,选择属性类型的 IPictureDisp*

  7. 对于 实现类型,请单击 “获取/设置方法”。

  8. 键入 Get 和 Set Functions 的唯一名称,或接受默认名称。 (在此示例中,使用默认名称 GetControlPictureSetControlPicture

  9. 单击“完成”。

“添加属性向导”在控件标头中的调度映射注释之间添加以下代码(。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 控件呈现的多个函数。 这些函数 OnResetStateOnDraw自定义 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);

注释

类和函数名称可能与上面的示例不同。

完成修改后,重新生成项目以合并自定义图片属性的新功能,并使用测试容器测试新属性。 请参阅 使用测试容器测试属性和事件 了解有关如何访问测试容器的信息。

另请参阅

MFC ActiveX 控件
MFC ActiveX 控件:使用字体
MFC ActiveX 控件:属性页