windows程序设计学习笔记-图元文件

图元文件

老式图元文件

HDC hdcMeta = CreateMetaFile(NULL);
// …可以向对普通HDC对象那样,在其上调用GDI函数
// GDI函数调用信息存储到图元文件里

// 返回图元文件句柄
HMETAFILE hmf = CloseMetaFile(hdcMeta);

// 把图元文件内容应用于hdc
PlayMetaFile(hdc, hmf);

// 用完后,删除图元文件句柄
DeleteMetaFile(hmf);

typedef struct tagMETAFILEPICT
{
    LONG mm;
    LONG xExt;
    LONG yExt;
    LONG hMF;
}
METAFILEPICT;

把老式图元文件和剪切板交互用METAFILEPICT结构。

增强型图元文件

HDC hdcEMF = CreateEnhMetaFile(NULL, NULL, NULL, NULL);
// …可以向对普通HDC对象那样,在其上调用GDI函数
// GDI函数调用信息存储到图元文件里

// 返回图元文件句柄
HENHMETAFILE hemf = CloseEnhMetaFile(hdcEMF);

// 把图元文件内容应用于hdc
PlayEnhMetaFile(hdc, hmf, &rect);

// 用完后,删除图元文件句柄
DeleteEnhMetaFile(hmf);

hmf = GetEnhMetaFile(文件名); // 获取增强型图元文件句柄

typedef struct tagENHMETARECORD
{
    DWORD iType;
    DWORD nSize;
    DWORD dParm[1];
}
ENHMETARECORD;

这里写图片描述

图元文件存储格式相关:
图元文件可看成由一系列ENHMETARECORD的块结构组成。
每个块结构由iType类型字段来判断,块结构对应的GDI操作。
每个块结构由nSize来告知此块的大小。
dParm[1]表示这是一个变长段,用来存储与块类型对应的GDI调用信息。

扩展图元文件开头的块是 文件头块。此块的解释见截图。

对于期间创建GDI对象的调用,在dParm部分,开始4字节为此对象ID。从1开始分配。
后面对象选入块,直接用此ID表示选入了对应的对象。
选入的对象是备用对象时,选入块dParm部分为最高位为1的4字节。

// 创建设备环境为增强型图元文件
HDC CreateEnhMetaFile(
  _In_       HDC     hdcRef,
  _In_       LPCTSTR lpFilename,
  _In_ const RECT    *lpRect,
  _In_       LPCTSTR lpDescription
);

参数解释:
hdcRef:参考设备环境句柄。
lpFilename:被创建的增强型图元文件名。
lpRect:以0.01毫米为单位指定的存储在增强型图元文件里图片的维度。
lpDescription:指定创建图片的应用名和图片标题。中间’\0’分隔。结尾两个’\0’。

返回值:
成功,指向增强型图元文件的设备环境句柄。
失败,NULL。

// 枚举增强型图元文件里的记录
// 取得每个记录然后把其传递给回调函数
// 枚举继续直到处理了最后一个记录或回调函数返回了0
BOOL EnumEnhMetaFile(
  _In_       HDC           hdc,
  _In_       HENHMETAFILE  hemf,
  _In_       ENHMFENUMPROC lpEnhMetaFunc,
  _In_       LPVOID        lpData,
  _In_ const RECT          *lpRect
);

参数解释:
hdc:设备环境句柄,会传递给回调函数。
hemf:增强型图元文件句柄
lpEnhMetaFunc:指向回调函数
lpRect:指定图片左上和右下角的逻辑坐标。

返回值:
成功枚举了所有记录,返回0
否则,返回0

// 应用定义的回调函数
int CALLBACK EnhMetaFileProc(
  _In_       HDC           hDC,
  _In_       HANDLETABLE   *lpHTable,
  _In_ const ENHMETARECORD *lpEMFR,
  _In_       int           nObj,
  _In_       LPARAM        lpData
);

参数解释:
hdc:设备环境句柄
lpHTable:句柄表。
lpEMFR:图元文件记录。
nObj:句柄表里对象数量。
lpData:指向可选数据。
返回值:
非0,继续枚举
0,停止枚举

BOOL PlayEnhMetaFileRecord(
  _In_       HDC           hdc,
  _In_       LPHANDLETABLE lpHandletable,
  _In_ const ENHMETARECORD *lpEnhMetaRecord,
  _In_       UINT          nHandles
);

参数解释:前面四个参数含义同EnumMetaFileProc中。
返回值:
成功,非0
失败,0

lpHandletable中第一个元素是图元文件句柄,其余各个元素是在PlayEnhMetaFileRecord中执行对象创建,对象选入,对象删除时进行维护的。

// 拷贝增强型图元文件内容到指定文件
HENHMETAFILE CopyEnhMetaFile(
  _In_ HENHMETAFILE hemfSrc,
  _In_ LPCTSTR      lpszFile
);

参数解释:
hemfSrc:要拷贝的增强型图元文件句柄
lpszFile:目的文件名。为NULL,源图元文件被拷贝到内存。

返回值:
成功,拷贝的增强型图元文件句柄。
失败,NULL。

可以对图元文件的生成过程和现实过程使用映射模式,来简化操作。
生成时使用映射模式指的是,把CreateEnhMetaFile返回的设备环境句柄,设置为某个映射模式后,对其调用GDI函数。
显示时使用映射模式指的是,对PlayEnhMetaFile或PlayEnhMetaFile传入的hdc先设置映射模式,并根据映射模式信息设置 显示矩形信心。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raindayinrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值