图元文件
老式图元文件
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先设置映射模式,并根据映射模式信息设置 显示矩形信心。