zoukankan      html  css  js  c++  java
  • 用 GDI 操作 EMF 文件[7]: EnumEnhMetaFile、PlayEnhMetaFileRecord 枚举文件中的图形命令

    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
    
  • 相关阅读:
    【NOIP 2003】 加分二叉树
    【POJ 1655】 Balancing Act
    【HDU 3613】Best Reward
    【POJ 3461】 Oulipo
    【POJ 2752】 Seek the Name, Seek the Fame
    【POJ 1961】 Period
    【POJ 2406】 Power Strings
    BZOJ3028 食物(生成函数)
    BZOJ5372 PKUSC2018神仙的游戏(NTT)
    BZOJ4836 二元运算(分治FFT)
  • 原文地址:https://www.cnblogs.com/del/p/1214285.html
Copyright © 2011-2022 走看看