这包括:
//方法
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;

posted on 2009-12-31 21:48  万一  阅读(3251)  评论(2编辑  收藏  举报