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

来源:互联网 发布:php class命名规范 编辑:程序博客网 时间:2024/06/05 11:37

图元文件

老式图元文件

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。

// 枚举增强型图元文件里的记录// 取得每个记录然后把其传递给回调函数// 枚举继续直到处理了最后一个记录或回调函数返回了0BOOL 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 0
原创粉丝点击