65.9K
CodeProject 正在变化。 阅读更多。
Home

WTL 元文件助手

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (3投票s)

2002年10月13日

4分钟阅读

viewsIcon

78317

downloadIcon

2221

本文描述了一个辅助类,该类可以从资源或磁盘加载元文件。 它同时支持 Windows 和增强型元文件。

图 1. 静态控件中的元文件

图 2. 作为背景图像的元文件

引言

本文解释了如何在 WTL 应用程序中使用 CMeta 类。 本文附带的示例项目是一个向导生成的对话框应用程序,它增强了两个静态控件以显示元文件图像。 关于对话框演示了如何使用元文件作为背景图像。 该类支持 Windows 和增强型元文件,并且可以加载资源或磁盘文件。

元文件

有两种类型的元文件图像:较早的 Windows 元文件 (WMF) 和较新的增强型元文件 (EMF)。 WMF 文件作为剪贴画集合的一部分很容易获得,并且与多个 Microsoft 产品一起安装。 EMF 较少流行,但在一些软件功能中被内部使用,例如打印预览器。 这两种类型都可缩放并支持图像透明度。

使用 CMeta

CMeta 继承自 WTL 的 atlgdi.h 头文件中的 CEnhMetaFile。 它增加了对从资源或磁盘文件加载 Windows 和增强型元文件的支持。 为了易于使用,Windows 元文件在加载时被转换为增强型。 加载元文件后,可以将其分配给支持增强型元文件的静态控件或其他控件。 这些是在对话框上的静态控件中显示元文件资源的基本步骤

  1. 在应用程序 .cpp 中包含 Meta.h
  2. 使用资源编辑器将元文件(自定义资源)导入到项目中
  3. CMeta 成员变量添加到对话框类
  4. OnInitDialog() 中从资源加载元文件
  5. 使用资源编辑器将静态控件添加到对话框
  6. 将静态控件类型设置为增强型元文件
  7. 使用 SetEnhMetaFile() 将元文件分配给静态控件

以下是 OnInitDialog() 的示例代码,显示了如何从资源加载元文件图像

// FALSE = WMF, TRUE = EMF
m_meta.LoadMetaResource(IDR_BIRD, FALSE);
CStatic(GetDlgItem(IDC_STATIC1)).SetEnhMetaFile(m_meta);

也可以使用 PlayEnhMetaFile() 将元文件“播放”到设备上下文,加载后可以从资源或磁盘加载。 这些是在对话框的设备上下文中播放元文件资源的基本步骤

  1. 上述步骤 1 到 4
  2. 使用 PlayEnhMetaFile() (不)显示元文件

本文后面的“背景图像”部分解释了如何设置消息处理程序并将元文件作为对话框背景图像播放。 在示例项目中,这在关于对话框中得到了演示。

LoadMetaResource()

LoadMetaResource() 方法用于加载增强型或 Windows 元文件资源。 资源是资源编译器添加到应用程序可执行文件中的二进制数据。 有标准资源,例如图标和字符串,以及自定义资源,它们几乎可以是任何东西。 这两种类型的元文件都是自定义资源。 导入元文件时,根据需要调用自定义资源类型 Metafile 或 EnhMetafile。

LoadMetaResource() 接受一个资源 ID 作为输入,并将 m_hEMF 变量设置为生成的元文件的句柄。 布尔输入参数指示元文件是增强型 (TRUE) 还是 Windows (FALSE)。

LoadMetaFile()

LoadMetaFilee() 接受一个布尔输入参数,以指示元文件是增强型 (TRUE) 还是 Windows (FALSE)。 它还接受一个可选的文件名,如果未提供文件名参数,则使用标准文件打开对话框提示用户。

当您单击示例项目主对话框上的“文件”按钮时,它会调用以下方法来加载基于磁盘的元文件。 m_left 是用于左侧静态控件的元文件的 CMeta 成员变量。

LRESULT OnFileOpen(WORD, WORD, HWND, BOOL&)
{ // load a windows metafile. Prompt user for file name
  m_left.LoadMetaFile(m_hWnd, FALSE);

  // load and refresh the static control
  CStatic st(GetDlgItem(IDC_STATIC1));
  st.SetEnhMetaFile(m_left);
  st.Invalidate();

  return 0; }

背景图像

关于对话框中提供了如何使用元文件作为背景图像的示例。 本文前面讨论了如何“播放”元文件的基本步骤。 除了这些步骤之外,还将 WM_ERASEBKGND 消息添加到对话框的消息映射中,并将以下处理程序添加到处理消息中。 m_bkgndCMeta 成员变量,wParam 携带对话框的设备上下文。

LRESULT OnEraseBkgnd(UINT, WPARAM wParam, LPARAM, BOOL&)
{
  RECT rc;
  GetClientRect(&rc);

  // fill in background color
  ::FillRect((HDC)wParam, &rc, (HBRUSH)(COLOR_BACKGROUND));

  // paint background metafile
  return ::PlayEnhMetaFile((HDC)wParam, m_bkgnd, &rc);
}

此外,将 WM_CTLCOLORSTATIC 添加到消息映射,并使用此消息处理程序,以便静态控件透明地显示在背景图像上

LRESULT OnCtlColorStatic(UINT, WPARAM wParam, LPARAM lParam, BOOL&)
{
  SetBkMode((HDC)wParam, TRANSPARENT);

  // return a null brush so image behind static isn't erased
  return (LRESULT)::GetStockObject(NULL_BRUSH);
}

使用条款

本文提供的示例应用程序和源代码可用于任何目的。

本软件按“现状”分发,不提供任何形式的担保。

© . All rights reserved.