图元文件
在内部,图元文件是称为 图元文件记录的可变长度结构的数组。
图元文件中的第一条记录指定常规信息,例如创建图片的设备分辨率、图片的尺寸等。 其余记录构成任何图元文件的大部分,对应于图形设备接口 (绘制图片所需的 GDI) 函数。 创建特殊的图元文件设备上下文后,这些记录将存储在图元文件中。 然后,此图元文件设备上下文将用于创建图片所需的所有绘图操作。 当系统处理与图元文件 DC 关联的 GDI 函数时,它会将该函数转换为适当的数据,并将此数据存储在追加到图元文件中的记录中。 图片完成后,最后一条记录存储在图元文件中后,可以通过以下方式将图元文件传递给另一个应用程序: 使用剪贴板 将其嵌入另一个文件中 将其存储在磁盘上 反复播放 当图元文件记录转换为设备命令并由相应设备处理时,将 播放 图元文件。 有两种类型的图元文件:增强格式的图元文件、Windows 格式图元文件 增强格式图元文件包含以下元素: 标头 GDI 对象的句柄表 私人调色板 图元文件记录数组 增强型图元文件提供真正的设备独立性。 可以将存储在增强图元文件中的图片视为在特定时刻拍摄的视频显示的“快照”。 无论此“快照”出现在打印机、绘图仪、桌面或任何应用程序的工作区中的何处,它都保持其尺寸。 可以使用增强型图元文件来存储通过使用 GDI 函数创建的图片 (包括新路径和转换函数)。 由于增强型图元文件格式是标准化的,因此以此格式存储的图片可以从一个应用程序复制到另一个应用程序; 并且,由于图片是真正独立于设备,因此保证它们在任何输出设备上保持其形状和比例。 增强型图元文件是记录数组。 图元文件记录是可变长度 的 元记录类 结构。 每个增强型图元文件记录的开头都是一个 EMR 结构,其中包含两个成员。 第一个成员 类别 标识记录类型, 即其参数包含在记录中的 GDI 函数。 由于结构长度可变,因此另一个成员 大小 包含记录的大小。 紧跟在 大小 成员之后是 GDI 函数的其余参数(如果有)。 结构的其余部分包含依赖于记录类型的其他数据。 增强型图元文件中的第一条记录始终是 强图头类 结构,即增强型图元文件标头。 可以使用 创建强图 函数创建增强型图元文件,并提供相应的参数。 系统使用这些参数来维护图片尺寸,确定图元文件应存储在磁盘上还是内存中,等等。 若要跨输出设备维护图片尺寸, 创建强图 需要参考设备的分辨率。 此 参考设备 是首次显示图片的设备, 参考 DC 是与参考 设备关联的设备上下文 。 调用 创建强图 函数时,必须提供标识此 DC 的句柄。 可以通过调用 取设备 或 创建设备 函数来获取此句柄。 还可以指定 NULL 作为句柄,以将当前显示设备用于参考设备。 大多数应用程序永久存储图片,因此创建存储在磁盘上的增强型图元文件;但是,某些情况下不需要这样做。 例如,提供图表绘制功能的字处理应用程序可以将用户定义的图表作为增强型图元文件存储在内存中, 然后将增强型图元文件位从内存复制到用户的文档文件中。 需要永久存储在磁盘上的图元文件的应用程序在调用 创建强图 时必须提供文件名。 如果不提供文件名,系统会自动将图元文件视为临时文件并将其存储在内存中。 可以将可选文本说明添加到包含图片和作者相关信息的图元文件。 应用程序可以在“文件打开”对话框中显示这些字符串,以便为用户提供有关图元文件内容的信息,有助于选择相应的文件。 如果应用程序包含文本说明,则必须在调用 创建强图 时提供指向字符串的指针。 当 创建强图 成功时,它将返回标识特殊图元文件设备上下文的句柄。 图元文件设备上下文是唯一的,因为它与文件关联,而不是与输出设备关联。 当系统处理接收图元文件设备上下文句柄的 GDI 函数时,它会将 GDI 函数转换为增强型图元文件记录, 并将该记录追加到增强型图元文件的末尾。 完成图片并将最后一条记录追加到增强型图元文件后,应用程序可以通过调用 关闭强图 函数关闭该文件。 此函数关闭并删除特殊图元文件设备上下文,并返回标识增强型图元文件的句柄。 若要删除增强格式图元文件或增强格式图元文件句柄,请调用 删除强图 函数。 显示存储在增强型图元文件中的图片 可以使用 显示强图 函数显示存储在增强型图元文件中的图片。 将函数的句柄传递给增强型图元文件,而不考虑增强型图元文件记录的格式。 但是,有时需要枚举增强型图元文件中的记录,以搜索特定的 GDI 函数并以某种方式修改函数的参数。 为此,可以使用 枚举强图 并提供回调函数 枚举强图回调 来处理增强型图元文件记录。 若要修改增强型图元文件记录的参数,必须知道记录中参数的格式。 创建增强型图元文件的副本 某些应用程序创建临时备份 (或复制文件) 副本,然后允许用户更改原始文件。 应用程序可以通过调用 复制强图 函数、提供标识增强型图元文件的句柄以及提供指向新文件名称的指针来创建增强型图元文件的备份副本。 若要创建基于内存的增强格式图元文件,请调用 数据强图 函数。 编辑增强型图元文件 大多数绘图、插图和计算机辅助设计 (CAD) 应用程序都需要编辑存储在增强型图元文件中的图片。 尽管编辑增强型图元文件是一项复杂的任务,但可以将 枚举强图 函数与其他函数结合使用,在应用程序中提供此功能。 枚举强图 函数及其关联的回调函数 枚举强图回调 使应用程序能够处理增强型图元文件中的单个记录。 检索存储在增强型图元文件中的可选说明 某些应用程序在“ 打开 ”对话框中显示具有相应文件名的增强型图元文件的文本说明。 通过使用 强图标头 函数检索图元文件标头并检查其成员之一,可以确定增强型图元文件中是否存在此字符串。 如果该字符串存在,应用程序将通过调用 强图描述 函数来检索它。 检索增强型图元文件的二进制版本 可以通过调用 强图数据 函数来检索图元文件的内容;但是,在检索内容之前,必须指定文件的大小。 若要获取大小,可以使用 强图标头 函数并检查相应的成员。 枚举可选调色板中的颜色 若要在各种输出设备上显示图片时实现一致的颜色,可以调用 创建色板 函数并将逻辑调色板存储在增强型图元文件中。 显示存储在增强型图元文件中的图片的应用程序检索此调色板,并在显示图片之前调用 色板映射 函数。 若要确定调色板是否存储在增强型图元文件中,请检索图元文件标头并检查相应的成员。 如果存在调色板,则可以调用 强图色板 函数来检索逻辑调色板。 Microsoft Windows 格式的图元文件的功能有限,很少应使用。 支持 Windows 格式函数,以保持与已编写为作为 16 位基于 Windows 的应用程序运行的应用程序的向后兼容性。 应改用增强格式函数。 基于 Windows 的 16 位应用程序使用 Windows 格式图元文件。 格式由标头和图元文件记录数组组成。 以下是此格式的限制: Windows 格式的图元文件依赖于应用程序和设备。 应用程序的映射模式或设备分辨率的更改会影响以此格式创建的图元文件的外观。 Windows 格式图元文件不包含描述原始图片尺寸、创建图片的设备分辨率、可选文本说明或可选调色板的综合标头。 Windows 格式图元文件不支持新的曲线、路径和转换函数。 请参阅下表中支持的函数列表。 某些 Windows 格式的图元文件记录无法缩放。 无法查询与 Windows 格式图元文件关联的图元文件设备上下文, (即应用程序无法检索设备分辨率数据、字体指标等) 。中文名称 | 英文名称 | 示例 | 作用 |
关闭强图 | CloseEnhMetaFile | 文件=关闭强图(设备) | 关闭增强型图元文件设备,并返回一个标识增强格式的图元文件的句柄 |
关闭图元 | CloseMetaFile | 文件=关闭图元(设备) | 关闭元文件设备并返回一个标识Windows格式的元文件的句柄 |
复制强图 | CopyEnhMetaFileA | 复制强图(图元文件,文件名) | 将增强格式的元文件的内容复制到指定的文件。 |
复制图元 | CopyMetaFileA | 复制图元(图元文件,文件名) | 将Windows格式的元文件的内容复制到指定的文件。 |
创建强图 | CreateEnhMetaFileA | 设备=创建强图(设备,文件名,矩形,描述) | 为增强格式的图元文件创建一个设备上下文。该设备上下文可用于存储与设备无关的图片。 |
创建图元 | CreateMetaFileA | 设备=创建图元(文件名) | 为Windows格式的图元文件创建一个设备 |
删除强图 | DeleteEnhMetaFile | 删除强图(设备) | 删除增强格式的图元文件或增强格式的图元文件句柄。 |
删除图元 | DeleteMetaFile | 删除图元(设备) | 删除Windows格式的图元文件或Windows格式的图元文件句柄。 |
枚举强图 | EnumEnhMetaFile | 枚举强图(设备,强元,@回调,数据,矩形) | 通过检索每个记录并将其传递给指定的回调函数来枚举增强格式的图元文件中的记录。 |
枚举图元 | EnumMetaFile | 枚举图元(设备,图元,@回调,参数) | 检索每个记录并将其传递给指定的回调函数来枚举Windows格式的图元文件中的记录。 |
注释图层 | GdiComment | 注释图层 | 将注释从缓冲区复制到指定的增强格式的图元文件中。 |
增强图元 | GetEnhMetaFileA | 强图=增强图元(文件名) | 获取指定文件中的增强格式的元文件句柄 |
强图数据 | GetEnhMetaFileBits | 强图数据(强图,长度,数据) | 从增强格式的图元文件中获取文件内容到数据缓冲区 |
数据强图 | SetEnhMetaFileBits | 强图=数据强图(长度,数据) | 从指定的数据创建基于内存的增强格式图元文件。 |
强图描述 | GetEnhMetaFileDescriptionA | 长度=强图描述(强图,内容,长度) | 从增强格式的图元文件中检索可选文本描述 |
强图标头 | GetEnhMetaFileHeader | 长度=强图标头(强图,大小,@标头) | 检索包含指定增强格式图元文件的标头的记录。标头为0返回长度 |
强图色板 | GetEnhMetaFilePaletteEntries | 长度=强图色板(强图,数目,数据) | 从增强格式的图元文件中检索指定数目的调色板数据 |
强图像素 | GetEnhMetaFilePixelFormat | 长度=强图像素(强图,长度,像素) | 从增强格式的图元文件中检索像素格式信息 |
图元文件 | GetMetaFileA | 图元=图元文件(文件名) | 获取指定文件中的图元文件句柄 |
图元数据 | GetMetaFileBitsEx | 图元数据(图元,长度,数据) | 从图元文件中获取文件内容到数据缓冲区 |
数据图元 | SetMetaFileBitsEx | 图元=图元数据(长度,数据) | 从指定的数据创建基于内存的图元文件。 |
显示强图 | PlayEnhMetaFile | 显示强图(设备,强图,矩形) | 显示存储在指定增强格式图元文件中的图片。 |
回放强图 | PlayEnhMetaFileRecord | 回放强图(设备,图组,记录,数量) | 播放增强的图元文件记录 |
显示图元 | PlayMetaFile | 显示图元(设备,强图,矩形) | 显示存储在指定图元文件中的图片。 |
回放图元 | PlayMetaFileRecord | 回放图元(设备,图组,记录,数量) | 播放图元文件记录 |
强图格式 | GetWinMetaFileBits | 强图格式(强图,大小,@数据,映射模式,设备) | 将图元文件中的增强格式记录转换为 Windows 格式的记录,并将转换后的记录存储在指定的缓冲区中。 |
转强图元 | SetWinMetaFileBits | 强元=转强图元(大小,数据,设备,元图) | 将图元文件转换为新的增强格式,元文件元图类 结构包含建议大小及映射模式 |
元图类
中文名字 | 英文名称 | 长度 | 作用解释 |
元图类 | METAFILEPICT | 16 | 定义用于通过剪贴板交换图元文件数据的图元文件图片格式。 |
元图类——成员表 | |||
---|---|---|---|
映射 | mm | 整数 | 绘制图片的映射模式。 |
宽度 | xExt | 整数 | 指定在其中绘制图片的矩形的宽度。 |
高度 | yExt | 整数 | 指定在其中绘制图片的矩形的高度。 |
图元 | hMF | 整数 | 内存图元文件的句柄。 |
元记录类
中文名字 | 英文名称 | 长度 | 作用解释 |
元记录类 | ENHMETARECORD | 12+ | 包含描述图形设备接口的数据, (GDI) 函数用于在增强格式图元文件中创建图片的一部分。 |
元记录类——成员表 | |||
---|---|---|---|
类别 | iType | 整数 | 记录类型。 此成员必须指定为1。 |
大小 | nSize | 整数 | 记录的大小(以字节为单位)。 |
数组 | dParm[1] | 整数 | 传递给由记录标识的 GDI 函数的参数数组。 |
强图头类
中文名字 | 英文名称 | 长度 | 作用解释 |
强图头类 | ENHMETAHEADER | 112 | 包含增强型图元文件数据,例如增强型图元文件中存储的图片尺寸、增强型图元文件中的记录计数、创建图片的设备分辨率等。 |
强图头类——成员表 | |||
---|---|---|---|
类别 | iType | 整数 | 记录类型。 此成员必须指定为1。 |
大小 | nSize | 整数 | 结构大小(以字节为单位)。 |
边框 | rclBounds | 矩形类 | 可以在图元文件中存储的图片周围绘制的最小矩形的尺寸(以设备单位为单位)。 此矩形由图形设备接口 (GDI) 提供。 其尺寸包括右边缘和下边缘。 |
框架 | rclFrame | 矩形类 | 矩形的尺寸(以 0.01 毫米为单位),该矩形围绕存储在图元文件中的图片。 此矩形必须由创建图元文件的应用程序提供。 其尺寸包括右边缘和下边缘。 |
签名 | dSignature | 整数 | 签名。 此成员必须指定为0x464D4520。 |
版本 | nVersion | 整数 | 图元文件版本。 当前版本值0x10000。 |
长度 | nBytes | 整数 | 增强型图元文件的大小(以字节为单位)。 |
记录 | nRecords | 整数 | 增强型图元文件中的记录数。 |
柄数 | nHandles | 整数 | 增强型图元文件句柄表中的句柄数。 此表中 (索引为零。) |
预留 | sReserved | 整数 | 保留;必须为零。 |
说明 | nDescription | 整数 | 数组中包含增强型图元文件内容的说明的字符数。 如果增强型图元文件不包含说明字符串,则应将此成员设置为零。 |
释偏 | offDescription | 整数 | 从结构的开头到包含增强型图元文件内容说明的数组的偏移量。 如果增强型图元文件不包含说明字符串,则应将此成员设置为零。 |
条目 | nPalEntries | 整数 | 增强型图元文件的调色板中的条目数。 |
像宽 | szlDevice.dx | 整数 | 引用设备的分辨率水平宽度(以像素为单位)。 |
像高 | szlDevice.dy | 整数 | 引用设备的分辨率垂直高度(以像素为单位)。 |
毫宽 | szlMillimeters.dx | 整数 | 参考设备的分辨率水平宽度(以毫米为单位)。 |
毫高 | szlMillimeters.dy | 整数 | 参考设备的分辨率垂直高度(以毫米为单位)。 |
像素 | cbPixelFormat | 整数 | 图元文件中最后记录的像素格式的大小。 如果在录制开始时在引用 DC 中设置了像素格式, 则设置为 像素格式类 的大小。如果录制图元文件时未设置像素格式,则此成员设置为零。 如果设置了多个像素格式,则标头指向最后一个像素格式。 |
像偏 | offPixelFormat | 整数 | 录制图元文件时使用的像素格式的偏移量。 如果在录制开始时或录制期间在引用 DC 中设置了像素格式, 则设置为图元文件中 像素格式类 的偏移量。 如果在记录图元文件时未设置像素格式,则此成员将设置为零。 如果设置了多个像素格式,则标头指向最后一个像素格式。 |
开图 | bOpenGL | 整数 | 指示图元文件中是否存在任何 OpenGL 记录。 bOpenGL 是一个简单的布尔标志,可用于确定增强的图元文件是否需要 OpenGL 处理。 当图元文件包含 OpenGL 记录时, bOpenGL 为 TRUE;否则为 FALSE。 |
微宽 | szlMicrometers.dx | 整数 | 参考设备的大小(以微米为单位)。 |
微高 | szlMicrometers.dy | 整数 | 参考设备的大小(以微米为单位)。 |