- 1、本文档共30页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于windows编程技术11GDI编程4图元文件和打印
第11章 GDI编程4—图元文件与打印
图元文件是一种矢量图形文件,用于绘图指令序列的文件存储和播放再现。与点阵图像相比,图形文件所占的空间小,且可任意缩放而不产生马赛克效应, 但是绘制图形需要一定的时间。图元文件还可用于交互绘图中的图形重绘和图形软件中的图元编辑。
GDI除了支持图形的屏幕绘制外,也支持图形的打印输出。使用传统的API进行Windows的打印编程,异常复杂和艰难。而MFC对打印功能的封装,大大简化了程序员的打印编程工作。
本章将对使用MFC进行图元文件和打印编程的具体方法分别做一些简单介绍。
11.1 图元文件
GDI从一开始就支持(图)元文件(metafile),早期(1985年起)的版本为WMF(Windows MetaFile,视窗元文件),主要针对Win16(Win3.x),后来(1990年起)也支持Win32(Win95/ 98/Me)。以后(1993年)随Windows NT推出了改进的图元文件版本——EMF(Enhanced Windows MetaFile,增强型视窗元文件),只支持Win32(Win95/98/Me/NT/2000/XP/Vista/7)。现在(2001年起)又随Windows XP和GDI+推出了加强型图元文件EMF——EMF+,可以同时支持GDI和GDI+。
表11-1 图元文件所支持的GDI类型
元文件类型 Win16 GDI Win32 GDI Win32/64 GDI+ WMF √ √ × EMF × √ × EMF+ × √ √ 本节只介绍GDI中的图元文件格式WMF和EMF,重点介绍在MFC中使用图元文件。至于GDI+中的图元文件格式EMF+和如何在GDI+编程中使用图元文件及其相关类,将在14.4节中介绍。
11.1.1 图元文件格式
下面分别介绍WMF和EMF的具体文件格式。
1.WMF文件格式
元文件结构——WMF文件由文件头和若干元文件记录组成,参见图11-1。
视窗元文件头 元文件记录
…… 图11-1 WMF的文件结构
元文件头——WMF的文件头用结构METAHEADER定义:
typedef struct tagMETAHEADER {
WORD mtType; // 元文件类型:内存=0、磁盘文件=1
WORD mtHeaderSize; // 文件头大小的字数
WORD mtVersion; // 系统的版本号:支持DIB=0x0300、不支持DIB=0x0100
DWORD mtSize; // 文件大小的字数
WORD mtNoObjects; // 同时存在于元文件内的最大对象数
DWORD mtMaxRecord; // 元文件中最大记录的字大小
WORD mtNoParameters; // 保留字段
} METAHEADER;
元文件记录——WMF的元文件记录用结构METARECORD定义:
typedef struct tagMETARECORD {
DWORD rdSize; // 记录大小的字数
WORD rdFunction; // 功能/函数号(记录类型META_XXX)
WORD rdParm[1]; // 函数参数数组,逆序排列
} METARECORD;
WMF中的图元文件记录类型共有67种,包含所有的绘图设置和操作(DC函数),例如:设置二元光栅操作(符号常量META_SETROP2,对应数值0x0104)、绘制矩形(META_RECTANGLE,0x041B)和输出文本(META_TEXTOUT,0x0521)等。
2.EMF文件格式
元文件结构——EMF文件由文件头、可选的描述串和调色板、及若干元文件记录组成,参见图11-2。
增强型元文件头 [描述串] [调色板] 元文件记录
…… 图11-2 EMF的文件结构
元文件头——EMF的文件头用结构ENHMETAHEADER定义(比WMF的复杂得多):
typedef struct tagENHMETAHEADER {
DWORD iType; // 记录类型,必须 = EMR_HEADER(= 1)
DWORD nSize; // 结构的字节大小,可能 sizeof(ENHMETAHEADER)
RECTL rclBounds; // 边界矩形(设备单位,含右边和底边)
RECTL rclFrame; // 边界矩形(0.01毫米单位HIMETRIC,含右边和底边)
DWORD dSignature; // 签名,必须 = ENHMETA_SIGNATURE(= 0x464D
文档评论(0)