这包括:
//方法
IGPMetafile.GetMetafileHeader; { 获取 Metafile 的 MetafileHeader }
IGPMetafile.GetHEnhMetafile; { 获取增强型 Metafile 的 Windows 句柄 }
IGPMetafile.PlayRecord(); { 播放单个图元文件记录 }
//属性
IGPMetafile.DownLevelRasterizationLimit; { 好像是控制纹理画刷的分辨率用的; 赋于 0 时则使用默认值. }
//还有
IGPGraphics.AddMetafileComment(); { 向当前 Metafile 添加注释 }
IGPGraphics.EnumerateMetafile(); { 枚举 Metafile 中的图形命令 }
IGPMetafile.GetMetafileHeader 获取文件信息, 得到一个 TGPMetafileHeader 结构对象:
TGPMetafileHeader.IsWmf; { 是否是 Wmf 格式 }
TGPMetafileHeader.IsEmf; { 是否是 Emf 格式 }
TGPMetafileHeader.IsEmfPlus; { 是否是 Emf+ 格式 }
TGPMetafileHeader.IsEmfOrEmfPlus; { 是否是 Emf 或 Emf+ 格式 }
TGPMetafileHeader.IsEmfPlusDual; { 是否是 "双重" 增强型图元文件格式, 它同时支持 Emf 和 Emf+ }
TGPMetafileHeader.IsWmfPlaceable; { 能否放置 Wmf }
TGPMetafileHeader.IsEmfPlusOnly; { 是否只支持 Emf+ }
TGPMetafileHeader.IsDisplay; { 是否与设备相关 }
TGPMetafileHeader.MetafileType; { 类型 }
TGPMetafileHeader.MetafileSize; { 大小; 以字节为单位 }
TGPMetafileHeader.Version; { 版本号 }
TGPMetafileHeader.Bounds; { 边界矩形 }
TGPMetafileHeader.DpiX; { 水平分辨率; 以每英寸点数为单位 }
TGPMetafileHeader.DpiY; { 垂直分辨率; 以每英寸点数为单位 }
TGPMetafileHeader.LogicalDpiX; { 逻辑水平分辨率; 以每英寸点数为单位 }
TGPMetafileHeader.LogicalDpiY; { 逻辑垂直分辨率; 以每英寸点数为单位 }
TGPMetafileHeader.EmfPlusFlags; { Emf+ 标志 }
TGPMetafileHeader.WmfHeader; { 获取 Wmf 文件头 }
TGPMetafileHeader.EmfHeader; { 获取 Emf 文件头 }
TGPMetafileHeader.EmfPlusHeaderSize; { 获取 EmfHeader 的大小 }
简单显示(或叫回放)图元文件:
uses GdiPlus;
procedure TForm1.FormPaint(Sender: TObject);
var
Metafile: IGPMetafile;
Graphics: IGPGraphics;
Pt: TGPPointF;
begin
Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
Graphics := TGPGraphics.Create(Handle);
Graphics.DrawImage(Metafile, 10, 10);
end;
使用回调函数回放图元文件之一:
uses GdiPlus;
var Metafile: IGPMetafile;
function MetafileProc(RecordType: TEmfPlusRecordType; Flags, DataSize: UINT;
Data: PByte; CallbackData: Pointer): BOOL; stdcall;
begin
Metafile.PlayRecord(RecordType, Flags, DataSize, Data);
Result := True;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
// Metafile: IGPMetafile;
Graphics: IGPGraphics;
Pt: TGPPointF;
begin
Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
Graphics := TGPGraphics.Create(Handle);
Pt.Initialize(10, 10);
Graphics.EnumerateMetafile(Metafile, Pt, MetafileProc);
end;
使用回调函数回放图元文件之二(不使用全局变量):
uses GdiPlus;
function MetafileProc(RecordType: TEmfPlusRecordType; Flags, DataSize: UINT;
Data: PByte; CallbackData: Pointer): BOOL; stdcall;
begin
IGPMetafile(CallbackData).PlayRecord(RecordType, Flags, DataSize, Data);
Result := True;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
Metafile: IGPMetafile;
Graphics: IGPGraphics;
Pt: TGPPointF;
begin
Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
Graphics := TGPGraphics.Create(Handle);
Pt.Initialize(10, 10);
Graphics.EnumerateMetafile(Metafile, Pt, MetafileProc, Pointer(Metafile));
end;
获取图元文件中命令总数:
uses GdiPlus;
var Metafile: IGPMetafile;
function MetafileProc(RecordType: TEmfPlusRecordType; Flags, DataSize: UINT;
Data: PByte; CallbackData: Pointer): BOOL; stdcall;
begin
Inc(PInteger(CallbackData)^);
Result := True;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
Graphics: IGPGraphics;
n: Integer;
begin
Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
Graphics := TGPGraphics.Create(Handle);
n := 0;
Graphics.EnumerateMetafile(Metafile, TGPPointF.Create(10,10), MetafileProc, @n);
Text := IntToStr(n); { 13 }
end;
获取图元文件的命令类型列表:
uses GdiPlus;
var
Metafile: IGPMetafile;
List: TStrings;
procedure TForm1.FormCreate(Sender: TObject);
begin
List := TStringList.Create;
List.CommaText :=
'66058=WmfRecordTypeSetTextJustification,'+
'66059=WmfRecordTypeSetWindowOrg,'+
'66060=WmfRecordTypeSetWindowExt,'+
'66061=WmfRecordTypeSetViewportOrg,'+
'66062=WmfRecordTypeSetViewportExt,'+
'66063=WmfRecordTypeOffsetWindowOrg,'+
'66576=WmfRecordTypeScaleWindowExt,'+
'66065=WmfRecordTypeOffsetViewportOrg,'+
'66578=WmfRecordTypeScaleViewportExt,'+
'66067=WmfRecordTypeLineTo,'+
'66068=WmfRecordTypeMoveTo,'+
'66581=WmfRecordTypeExcludeClipRect,'+
'66582=WmfRecordTypeIntersectClipRect,'+
'67607=WmfRecordTypeArc,'+
'66584=WmfRecordTypeEllipse,'+
'66585=WmfRecordTypeFloodFill,'+
'67610=WmfRecordTypePie,'+
'66587=WmfRecordTypeRectangle,'+
'67100=WmfRecordTypeRoundRect,'+
'67101=WmfRecordTypePatBlt,'+
'65566=WmfRecordTypeSaveDC,'+
'66591=WmfRecordTypeSetPixel,'+
'66080=WmfRecordTypeOffsetClipRgn,'+
'66849=WmfRecordTypeTextOut,'+
'67874=WmfRecordTypeBitBlt,'+
'68387=WmfRecordTypeStretchBlt,'+
'66340=WmfRecordTypePolygon,'+
'66341=WmfRecordTypePolyline,'+
'67110=WmfRecordTypeEscape,'+
'65831=WmfRecordTypeRestoreDC,'+
'66088=WmfRecordTypeFillRegion,'+
'66601=WmfRecordTypeFrameRegion,'+
'65834=WmfRecordTypeInvertRegion,'+
'65835=WmfRecordTypePaintRegion,'+
'65836=WmfRecordTypeSelectClipRegion,'+
'65837=WmfRecordTypeSelectObject,'+
'65838=WmfRecordTypeSetTextAlign,'+
'67119=WmfRecordTypeDrawText,'+
'67632=WmfRecordTypeChord,'+
'66097=WmfRecordTypeSetMapperFlags,'+
'68146=WmfRecordTypeExtTextOut,'+
'68915=WmfRecordTypeSetDIBToDev,'+
'66100=WmfRecordTypeSelectPalette,'+
'65589=WmfRecordTypeRealizePalette,'+
'66614=WmfRecordTypeAnimatePalette,'+
'65591=WmfRecordTypeSetPalEntries,'+
'66872=WmfRecordTypePolyPolygon,'+
'65849=WmfRecordTypeResizePalette,'+
'67904=WmfRecordTypeDIBBitBlt,'+
'68417=WmfRecordTypeDIBStretchBlt,'+
'65858=WmfRecordTypeDIBCreatePatternBrush,'+
'69443=WmfRecordTypeStretchDIB,'+
'66888=WmfRecordTypeExtFloodFill,'+
'65865=WmfRecordTypeSetLayout,'+
'65868=WmfRecordTypeResetDC,'+
'65869=WmfRecordTypeStartDoc,'+
'65615=WmfRecordTypeStartPage,'+
'65616=WmfRecordTypeEndPage,'+
'65618=WmfRecordTypeAbortDoc,'+
'65630=WmfRecordTypeEndDoc,'+
'66032=WmfRecordTypeDeleteObject,'+
'65783=WmfRecordTypeCreatePalette,'+
'65784=WmfRecordTypeCreateBrush,'+
'66041=WmfRecordTypeCreatePatternBrush,'+
'66298=WmfRecordTypeCreatePenIndirect,'+
'66299=WmfRecordTypeCreateFontIndirect,'+
'66300=WmfRecordTypeCreateBrushIndirect,'+
'66301=WmfRecordTypeCreateBitmapIndirect,'+
'67326=WmfRecordTypeCreateBitmap,'+
'67327=WmfRecordTypeCreateRegion,'+
'1=EmfRecordTypeHeader,'+
'2=EmfRecordTypePolyBezier,'+
'3=EmfRecordTypePolygon,'+
'4=EmfRecordTypePolyline,'+
'5=EmfRecordTypePolyBezierTo,'+
'6=EmfRecordTypePolyLineTo,'+
'7=EmfRecordTypePolyPolyline,'+
'8=EmfRecordTypePolyPolygon,'+
'9=EmfRecordTypeSetWindowExtEx,'+
'10=EmfRecordTypeSetWindowOrgEx,'+
'11=EmfRecordTypeSetViewportExtEx,'+
'12=EmfRecordTypeSetViewportOrgEx,'+
'13=EmfRecordTypeSetBrushOrgEx,'+
'14=EmfRecordTypeEOF,'+
'15=EmfRecordTypeSetPixelV,'+
'16=EmfRecordTypeSetMapperFlags,'+
'17=EmfRecordTypeSetMapMode,'+
'18=EmfRecordTypeSetBkMode,'+
'19=EmfRecordTypeSetPolyFillMode,'+
'20=EmfRecordTypeSetROP2,'+
'21=EmfRecordTypeSetStretchBltMode,'+
'22=EmfRecordTypeSetTextAlign,'+
'23=EmfRecordTypeSetColorAdjustment,'+
'24=EmfRecordTypeSetTextColor,'+
'25=EmfRecordTypeSetBkColor,'+
'26=EmfRecordTypeOffsetClipRgn,'+
'27=EmfRecordTypeMoveToEx,'+
'28=EmfRecordTypeSetMetaRgn,'+
'29=EmfRecordTypeExcludeClipRect,'+
'30=EmfRecordTypeIntersectClipRect,'+
'31=EmfRecordTypeScaleViewportExtEx,'+
'32=EmfRecordTypeScaleWindowExtEx,'+
'33=EmfRecordTypeSaveDC,'+
'34=EmfRecordTypeRestoreDC,'+
'35=EmfRecordTypeSetWorldTransform,'+
'36=EmfRecordTypeModifyWorldTransform,'+
'37=EmfRecordTypeSelectObject,'+
'38=EmfRecordTypeCreatePen,'+
'39=EmfRecordTypeCreateBrushIndirect,'+
'40=EmfRecordTypeDeleteObject,'+
'41=EmfRecordTypeAngleArc,'+
'42=EmfRecordTypeEllipse,'+
'43=EmfRecordTypeRectangle,'+
'44=EmfRecordTypeRoundRect,'+
'45=EmfRecordTypeArc,'+
'46=EmfRecordTypeChord,'+
'47=EmfRecordTypePie,'+
'48=EmfRecordTypeSelectPalette,'+
'49=EmfRecordTypeCreatePalette,'+
'50=EmfRecordTypeSetPaletteEntries,'+
'51=EmfRecordTypeResizePalette,'+
'52=EmfRecordTypeRealizePalette,'+
'53=EmfRecordTypeExtFloodFill,'+
'54=EmfRecordTypeLineTo,'+
'55=EmfRecordTypeArcTo,'+
'56=EmfRecordTypePolyDraw,'+
'57=EmfRecordTypeSetArcDirection,'+
'58=EmfRecordTypeSetMiterLimit,'+
'59=EmfRecordTypeBeginPath,'+
'60=EmfRecordTypeEndPath,'+
'61=EmfRecordTypeCloseFigure,'+
'62=EmfRecordTypeFillPath,'+
'63=EmfRecordTypeStrokeAndFillPath,'+
'64=EmfRecordTypeStrokePath,'+
'65=EmfRecordTypeFlattenPath,'+
'66=EmfRecordTypeWidenPath,'+
'67=EmfRecordTypeSelectClipPath,'+
'68=EmfRecordTypeAbortPath,'+
'69=EmfRecordTypeReserved_069,'+
'70=EmfRecordTypeGdiComment,'+
'71=EmfRecordTypeFillRgn,'+
'72=EmfRecordTypeFrameRgn,'+
'73=EmfRecordTypeInvertRgn,'+
'74=EmfRecordTypePaintRgn,'+
'75=EmfRecordTypeExtSelectClipRgn,'+
'76=EmfRecordTypeBitBlt,'+
'77=EmfRecordTypeStretchBlt,'+
'78=EmfRecordTypeMaskBlt,'+
'79=EmfRecordTypePlgBlt,'+
'80=EmfRecordTypeSetDIBitsToDevice,'+
'81=EmfRecordTypeStretchDIBits,'+
'82=EmfRecordTypeExtCreateFontIndirect,'+
'83=EmfRecordTypeExtTextOutA,'+
'84=EmfRecordTypeExtTextOutW,'+
'85=EmfRecordTypePolyBezier16,'+
'86=EmfRecordTypePolygon16,'+
'87=EmfRecordTypePolyline16,'+
'88=EmfRecordTypePolyBezierTo16,'+
'89=EmfRecordTypePolylineTo16,'+
'90=EmfRecordTypePolyPolyline16,'+
'91=EmfRecordTypePolyPolygon16,'+
'92=EmfRecordTypePolyDraw16,'+
'93=EmfRecordTypeCreateMonoBrush,'+
'94=EmfRecordTypeCreateDIBPatternBrushPt,'+
'95=EmfRecordTypeExtCreatePen,'+
'96=EmfRecordTypePolyTextOutA,'+
'97=EmfRecordTypePolyTextOutW,'+
'98=EmfRecordTypeSetICMMode,'+
'99=EmfRecordTypeCreateColorSpace,'+
'100=EmfRecordTypeSetColorSpace,'+
'101=EmfRecordTypeDeleteColorSpace,'+
'102=EmfRecordTypeGLSRecord,'+
'103=EmfRecordTypeGLSBoundedRecord,'+
'104=EmfRecordTypePixelFormat,'+
'105=EmfRecordTypeDrawEscape,'+
'106=EmfRecordTypeExtEscape,'+
'107=EmfRecordTypeStartDoc,'+
'108=EmfRecordTypeSmallTextOut,'+
'109=EmfRecordTypeForceUFIMapping,'+
'110=EmfRecordTypeNamedEscape,'+
'111=EmfRecordTypeColorCorrectPalette,'+
'112=EmfRecordTypeSetICMProfileA,'+
'113=EmfRecordTypeSetICMProfileW,'+
'114=EmfRecordTypeAlphaBlend,'+
'115=EmfRecordTypeSetLayout,'+
'116=EmfRecordTypeTransparentBlt,'+
'117=EmfRecordTypeReserved_117,'+
'118=EmfRecordTypeGradientFill,'+
'119=EmfRecordTypeSetLinkedUFIs,'+
'120=EmfRecordTypeSetTextJustification,'+
'121=EmfRecordTypeColorMatchToTargetW,'+
'122=EmfRecordTypeCreateColorSpaceW,'+
'16384=EmfPlusRecordTypeInvalid,'+
'16385=EmfPlusRecordTypeHeader,'+
'16386=EmfPlusRecordTypeEndOfFile,'+
'16387=EmfPlusRecordTypeComment,'+
'16388=EmfPlusRecordTypeGetDC,'+
'16389=EmfPlusRecordTypeMultiFormatStart,'+
'16390=EmfPlusRecordTypeMultiFormatSection,'+
'16391=EmfPlusRecordTypeMultiFormatEnd,'+
'16392=EmfPlusRecordTypeObject,'+
'16393=EmfPlusRecordTypeClear,'+
'16394=EmfPlusRecordTypeFillRects,'+
'16395=EmfPlusRecordTypeDrawRects,'+
'16396=EmfPlusRecordTypeFillPolygon,'+
'16397=EmfPlusRecordTypeDrawLines,'+
'16398=EmfPlusRecordTypeFillEllipse,'+
'16399=EmfPlusRecordTypeDrawEllipse,'+
'16400=EmfPlusRecordTypeFillPie,'+
'16401=EmfPlusRecordTypeDrawPie,'+
'16402=EmfPlusRecordTypeDrawArc,'+
'16403=EmfPlusRecordTypeFillRegion,'+
'16404=EmfPlusRecordTypeFillPath,'+
'16405=EmfPlusRecordTypeDrawPath,'+
'16406=EmfPlusRecordTypeFillClosedCurve,'+
'16407=EmfPlusRecordTypeDrawClosedCurve,'+
'16408=EmfPlusRecordTypeDrawCurve,'+
'16409=EmfPlusRecordTypeDrawBeziers,'+
'16410=EmfPlusRecordTypeDrawImage,'+
'16411=EmfPlusRecordTypeDrawImagePoints,'+
'16412=EmfPlusRecordTypeDrawString,'+
'16413=EmfPlusRecordTypeSetRenderingOrigin,'+
'16414=EmfPlusRecordTypeSetAntiAliasMode,'+
'16415=EmfPlusRecordTypeSetTextRenderingHint,'+
'16416=EmfPlusRecordTypeSetTextContrast,'+
'16417=EmfPlusRecordTypeSetInterpolationMode,'+
'16418=EmfPlusRecordTypeSetPixelOffsetMode,'+
'16419=EmfPlusRecordTypeSetCompositingMode,'+
'16420=EmfPlusRecordTypeSetCompositingQuality,'+
'16421=EmfPlusRecordTypeSave,'+
'16422=EmfPlusRecordTypeRestore,'+
'16423=EmfPlusRecordTypeBeginContainer,'+
'16424=EmfPlusRecordTypeBeginContainerNoParams,'+
'16425=EmfPlusRecordTypeEndContainer,'+
'16426=EmfPlusRecordTypeSetWorldTransform,'+
'16427=EmfPlusRecordTypeResetWorldTransform,'+
'16428=EmfPlusRecordTypeMultiplyWorldTransform,'+
'16429=EmfPlusRecordTypeTranslateWorldTransform,'+
'16430=EmfPlusRecordTypeScaleWorldTransform,'+
'16431=EmfPlusRecordTypeRotateWorldTransform,'+
'16432=EmfPlusRecordTypeSetPageTransform,'+
'16433=EmfPlusRecordTypeResetClip,'+
'16434=EmfPlusRecordTypeSetClipRect,'+
'16435=EmfPlusRecordTypeSetClipPath,'+
'16436=EmfPlusRecordTypeSetClipRegion,'+
'16437=EmfPlusRecordTypeOffsetClip,'+
'16438=EmfPlusRecordTypeDrawDriverString,'+
'16439=EmfPlusRecordTypeStrokeFillPath,'+
'16440=EmfPlusRecordTypeSerializableObject,'+
'16441=EmfPlusRecordTypeSetTSGraphics,'+
'16442=EmfPlusRecordTypeSetTSClip';
end;
function MetafileProc(RecordType: TEmfPlusRecordType; Flags, DataSize: UINT;
Data: PByte; CallbackData: Pointer): BOOL; stdcall;
begin
PString(CallbackData)^ := PString(CallbackData)^ + List.Values[IntToStr(Ord(RecordType))] + #13#10;
Result := True;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
Graphics: IGPGraphics;
str: string;
begin
Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
Graphics := TGPGraphics.Create(Handle);
Graphics.EnumerateMetafile(Metafile, TGPPointF.Create(10,10), MetafileProc, @str);
ShowMessage(str);
{ 结果:
EmfRecordTypeHeader
EmfPlusRecordTypeHeader
EmfPlusRecordTypeObject
EmfPlusRecordTypeDrawRects
EmfPlusRecordTypeDrawEllipse
EmfPlusRecordTypeSetAntiAliasMode
EmfPlusRecordTypeDrawEllipse
EmfPlusRecordTypeSetTextRenderingHint
EmfPlusRecordTypeRotateWorldTransform
EmfPlusRecordTypeObject
EmfPlusRecordTypeDrawString
EmfPlusRecordTypeEndOfFile
EmfRecordTypeEOF
}
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
List.Free;
end;
不回放其中的椭圆:
uses GdiPlus;
var Metafile: IGPMetafile;
function MetafileProc(RecordType: TEmfPlusRecordType; Flags, DataSize: UINT;
Data: PByte; CallbackData: Pointer): BOOL; stdcall;
begin
if RecordType <> EmfPlusRecordTypeDrawrEllipse then
begin
Metafile.PlayRecord(RecordType, Flags, DataSize, Data);
end;
Result := True;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
Graphics: IGPGraphics;
begin
Metafile := TGPMetafile.Create('C:\GdiPlusImg\SampleMetafile.emf');
Graphics := TGPGraphics.Create(Handle);
Graphics.EnumerateMetafile(Metafile, TGPPointF.Create(10, 10), MetafileProc);
end;