EnumEnhMetaFile( DC: HDC; {目标设备句柄; 如果回调函数不需要回放, 该参数为 0} Emf: HENHMETAFILE; {图元文件句柄} EnhMetaFunc: TFNEnhMFEnumProc; {回调函数指针; 回调函数格式见下} Data: Pointer; {自定义数据指针} const Rect: TRect {要输出的尺寸; 如果 DC=0 该参数会被忽略} ): BOOL; //EnumEnhMetaFile 使用的回调函数格式及参数, PlayEnhMetaFileRecord 基本就是使用这些参数: function EnhMetaFunc( DisplaySurface: HDC; {目标设备句柄; 如果回调函数不需要回放, 该参数为 0} var MetafileTable: THandleTable; {句柄表数组指针, 数组包含 HGDIOBJ 对象(画笔、画刷等); 元素1是文件自身句柄} var MetafileRecord: TEnhMetaRecord; {图元文件记录 TEnhMetaRecord 指针, TEnhMetaRecord 结构见下表} ObjectCount: Integer; {对象句柄数目, 即句柄表 MetafileTable 中图形对象的数目} var Data: Longint {自定义数据指针} ): Integer; stdcall; //TEnhMetaRecord 结构: tagENHMETARECORD = packed record iType: DWORD; {类型} nSize: DWORD; {尺寸} dParm: array[0..0] of DWORD; {参数数组} end; //TEnhMetaRecord.iType 的可能值: EMR_HEADER = 1; EMR_POLYBEZIER = 2; EMR_POLYGON = 3; EMR_POLYLINE = 4; EMR_POLYBEZIERTO = 5; EMR_POLYLINETO = 6; EMR_POLYPOLYLINE = 7; EMR_POLYPOLYGON = 8; EMR_SETWINDOWEXTEX = 9; EMR_SETWINDOWORGEX = 10; EMR_SETVIEWPORTEXTEX = 11; EMR_SETVIEWPORTORGEX = 12; EMR_SETBRUSHORGEX = 13; EMR_EOF = 14; EMR_SETPIXELV = 15; EMR_SETMAPPERFLAGS = $10; EMR_SETMAPMODE = 17; EMR_SETBKMODE = 18; EMR_SETPOLYFILLMODE = 19; EMR_SETROP2 = 20; EMR_SETSTRETCHBLTMODE = 21; EMR_SETTEXTALIGN = 22; EMR_SETCOLORADJUSTMENT = 23; EMR_SETTEXTCOLOR = 24; EMR_SETBKCOLOR = 25; EMR_OFFSETCLIPRGN = 26; EMR_MOVETOEX = 27; EMR_SETMETARGN = 28; EMR_EXCLUDECLIPRECT = 29; EMR_INTERSECTCLIPRECT = 30; EMR_SCALEVIEWPORTEXTEX = 31; EMR_SCALEWINDOWEXTEX = 32; EMR_SAVEDC = 33; EMR_RESTOREDC = 34; EMR_SETWORLDTRANSFORM = 35; EMR_MODIFYWORLDTRANSFORM = 36; EMR_SELECTOBJECT = 37; EMR_CREATEPEN = 38; EMR_CREATEBRUSHINDIRECT = 39; EMR_DELETEOBJECT = 40; EMR_ANGLEARC = 41; EMR_ELLIPSE = 42; EMR_RECTANGLE = 43; EMR_ROUNDRECT = 44; EMR_ARC = 45; EMR_CHORD = 46; EMR_PIE = 47; EMR_SELECTPALETTE = 48; EMR_CREATEPALETTE = 49; EMR_SETPALETTEENTRIES = 50; EMR_RESIZEPALETTE = 51; EMR_REALIZEPALETTE = 52; EMR_EXTFLOODFILL = 53; EMR_LINETO = 54; EMR_ARCTO = 55; EMR_POLYDRAW = 56; EMR_SETARCDIRECTION = 57; EMR_SETMITERLIMIT = 58; EMR_BEGINPATH = 59; EMR_ENDPATH = 60; EMR_CLOSEFIGURE = 61; EMR_FILLPATH = 62; EMR_STROKEANDFILLPATH = 63; EMR_STROKEPATH = $40; EMR_FLATTENPATH = 65; EMR_WIDENPATH = 66; EMR_SELECTCLIPPATH = 67; EMR_ABORTPATH = 68; EMR_GDICOMMENT = 70; EMR_FILLRGN = 71; EMR_FRAMERGN = 72; EMR_INVERTRGN = 73; EMR_PAINTRGN = 74; EMR_EXTSELECTCLIPRGN = 75; EMR_BITBLT = 76; EMR_STRETCHBLT = 77; EMR_MASKBLT = 78; EMR_PLGBLT = 79; EMR_SETDIBITSTODEVICE = 80; EMR_STRETCHDIBITS = 81; EMR_EXTCREATEFONTINDIRECTW = 82; EMR_EXTTEXTOUTA = 83; EMR_EXTTEXTOUTW = 84; EMR_POLYBEZIER16 = 85; EMR_POLYGON16 = 86; EMR_POLYLINE16 = 87; EMR_POLYBEZIERTO16 = 88; EMR_POLYLINETO16 = 89; EMR_POLYPOLYLINE16 = 90; EMR_POLYPOLYGON16 = 91; EMR_POLYDRAW16 = 92; EMR_CREATEMONOBRUSH = 93; EMR_CREATEDIBPATTERNBRUSHPT = 94; EMR_EXTCREATEPEN = 95; EMR_POLYTEXTOUTA = 96; EMR_POLYTEXTOUTW = 97; EMR_SETICMMODE = 98; EMR_CREATECOLORSPACE = 99; EMR_SETCOLORSPACE = 100; EMR_DELETECOLORSPACE = 101; EMR_GLSRECORD = 102; EMR_GLSBOUNDEDRECORD = 103; EMR_PIXELFORMAT = 104; EMR_DRAWESCAPE = 105; EMR_EXTESCAPE = 106; EMR_STARTDOC = 107; EMR_SMALLTEXTOUT = 108; EMR_FORCEUFIMAPPING = 109; EMR_NAMEDESCAPE = 110; EMR_COLORCORRECTPALETTE = 111; EMR_SETICMPROFILEA = 112; EMR_SETICMPROFILEW = 113; EMR_ALPHABLEND = 114; EMR_ALPHADIBBLEND = 115; EMR_TRANSPARENTBLT = 116; EMR_TRANSPARENTDIB = 117; EMR_GRADIENTFILL = 118; EMR_SETLINKEDUFIS = 119; EMR_SETTEXTJUSTIFICATION = 120;在下面的例子中, 先在内存中建立了一个图元文件, 再其中绘制了直线、矩形和两个椭圆;
然后控制显示了图元文件的部分及全部.
运行效果图:
代码文件:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) RadioGroup1: TRadioGroup; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure RadioGroup1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} var HMetaFile: HENHMETAFILE; {EMF 文件句柄} RadioGroupItemIndex: Integer = -1; //EnumEnhMetaFile 的回调函数 function MyEnhMetaFunc(DisplaySurface: HDC; var MetafileTable: THandleTable; var MetafileRecord: TEnhMetaRecord; ObjectCount: Integer; var Data: Longint ): Integer; stdcall; var itype: Integer; begin case RadioGroupItemIndex of 1: itype := EMR_RECTANGLE; 2: itype := EMR_ELLIPSE; end; if MetafileRecord.iType = itype then begin PlayEnhMetaFileRecord(DisplaySurface, MetafileTable, MetafileRecord, ObjectCount); Result := 1; end; end; procedure TForm1.FormCreate(Sender: TObject); var MetaFileDC: HDC; begin {文件建立在内存} MetaFileDC := CreateEnhMetaFile(0, nil, nil, nil); MoveToEx(MetaFileDC, 0, 0, nil); LineTo(MetaFileDC, 100, 100); {矩形} Rectangle(MetaFileDC, 10, 10, 30, 30); {椭圆} Ellipse(MetaFileDC, 30, 30, 50, 50); Ellipse(MetaFileDC, 45, 45, 65, 65); HMetaFile := CloseEnhMetaFile(MetaFileDC); DeleteObject(MetaFileDC); RadioGroup1.Items.CommaText := '整个图元文件,其中的矩形,其中的椭圆'; end; procedure TForm1.RadioGroup1Click(Sender: TObject); begin Repaint; RadioGroupItemIndex := RadioGroup1.ItemIndex; if RadioGroupItemIndex = 0 then PlayEnhMetaFile(Canvas.Handle, HMetaFile, ClientRect) else EnumEnhMetaFile(Canvas.Handle, HMetaFile, @MyEnhMetaFunc, nil, ClientRect); end; procedure TForm1.FormDestroy(Sender: TObject); begin DeleteEnhMetaFile(HMetaFile); end; end.窗体文件:
object Form1: TForm1 Left = 0 Top = 0 Caption = 'Form1' ClientHeight = 197 ClientWidth = 325 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'Tahoma' Font.Style = [] OldCreateOrder = False Position = poDesktopCenter OnCreate = FormCreate OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object RadioGroup1: TRadioGroup Left = 216 Top = 8 Width = 101 Height = 113 Caption = 'RadioGroup1' TabOrder = 0 OnClick = RadioGroup1Click end end