• Direct2D (2) : 基本图形命令测试



    代码:

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, ComCtrls, TypInfo, Direct2D;
    
    type
      TForm1 = class(TForm)
        ListBox1: TListBox;
        Panel1: TPanel;
        GroupBox1: TGroupBox;
        CheckBox1: TCheckBox;
        Edit1: TEdit;
        UpDown1: TUpDown;
        ColorBox1: TColorBox;
        GroupBox2: TGroupBox;
        CheckBox2: TCheckBox;
        ColorBox2: TColorBox;
        PaintBox1: TPaintBox;
        procedure FormCreate(Sender: TObject);
        procedure PaintBox1Paint(Sender: TObject);
        procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
        procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
        procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
        procedure ListBox1Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    type
      TEnumDraw = (eEllipse,eLine,eRectangle,eRoundRect,eFrameRect,ePie,eArc,eChord,ePolyLine,ePolygon,ePolyBezier);
      TPointArr4 = array[0..3] of TPoint;
    var
      ptss: array[TEnumDraw] of TPointArr4; //点数组的数组
      ppts: ^TPointArr4; //某个图形需要的点数组的指针
      ppt: PPoint;       //某个点的指针
      enum: TEnumDraw;   //表示当前选择的要绘制的图形类型
      flag: Boolean;     //判断鼠标是否按在操控点上
    
    {初始化数据}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      e: TEnumDraw;
    begin
      {初始化点数组}
      ptss[eEllipse][0] := Point(100,50);
      ptss[eEllipse][1] := Point(200,150);
      ptss[eEllipse][2] := Point(MaxInt,MaxInt);
      ptss[eEllipse][3] := Point(MaxInt,MaxInt);
      ptss[eRectangle] := ptss[eEllipse];
      ptss[eLine] := ptss[eEllipse];
      ptss[eRoundRect] := ptss[eEllipse];
      ptss[eFrameRect] := ptss[eEllipse];
    
      ptss[ePie][0] := Point(100,50);
      ptss[ePie][1] := Point(200,150);
      ptss[ePie][2] := Point(150,50);
      ptss[ePie][3] := Point(100,150);
      ptss[eArc] := ptss[ePie];
      ptss[eChord] := ptss[ePie];
    
      ptss[ePolyLine][0] := Point(100,50);
      ptss[ePolyLine][1] := Point(200,50);
      ptss[ePolyLine][2] := Point(200,150);
      ptss[ePolyLine][3] := Point(100,150);
      ptss[ePolygon] := ptss[ePolyLine];
      ptss[ePolyBezier] := ptss[ePolyLine];
    
      {填充 ListBox1}
      for e := Low(TEnumDraw) to High(TEnumDraw) do
      begin
        ListBox1.Items.Add(GetEnumName(TypeInfo(TEnumDraw), ord(e)));
      end;
      ListBox1.ItemIndex := 0;
    
      {初始化控件}
      Panel1.Caption := '';
      UpDown1.Associate := Edit1;
      Edit1.NumbersOnly := True;
      Edit1.Alignment := taCenter;
      UpDown1.Associate := Edit1;
      UpDown1.Min := 1;
      CheckBox1.Checked := True;
      CheckBox2.Checked := True;
      ColorBox1.Selected := clBlue;
      ColorBox2.Selected := clLime;
      {事件共享}
      CheckBox1.OnClick := ListBox1.OnClick;
      CheckBox2.OnClick := ListBox1.OnClick;
      ColorBox1.OnChange := ListBox1.OnClick;
      ColorBox2.OnChange := ListBox1.OnClick;
      Edit1.OnChange := ListBox1.OnClick;
    end;
    
    procedure TForm1.ListBox1Click(Sender: TObject);
    begin
      enum := TEnumDraw(ListBox1.ItemIndex);
      ppts := @ptss[enum];
      PaintBox1.Invalidate;
    end;
    
    procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      flag := PaintBox1.Cursor = crCross;
    end;
    
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    var
      i: Integer;
    begin
      if flag then
      begin
        ppt^ := Point(X, Y);
        PaintBox1.Invalidate;
        Exit;
      end;
    
      {判断鼠标是否在控制点上}
      for i := 0 to Length(ppts^) - 1 do
      begin
        if (ppts^[i].X <> MaxInt) and PtInRect(Rect(ppts^[i].X-4, ppts^[i].Y-4, ppts^[i].X+4, ppts^[i].Y+4), Point(X,Y)) then
        begin
          PaintBox1.Cursor := crCross;
          ppt := @ppts^[i]; //哪个控制点
          Exit;
        end else
          PaintBox1.Cursor := crDefault;
      end;
    end;
    
    procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      flag := False;
    end;
    
    {绘制}
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    var
      pts: TPointArr4;
      pt: TPoint;
    begin
      with TDirect2DCanvas.Create(PaintBox1.Canvas, PaintBox1.ClientRect) do
      begin
        BeginDraw;
        Pen.Color := ColorBox1.Selected;
        Pen.Width := StrToIntDef(Edit1.Text, 1);
        Brush.Color := ColorBox2.Selected;
    
        if not CheckBox1.Checked then Pen.Width := 0;
        if not CheckBox2.Checked then Brush.Style := bsClear;
    
        {绘制图形}
        pts := ppts^;
        case enum of
          eEllipse   : Ellipse(Rect(pts[0], pts[1]));
          eLine      : begin MoveTo(pts[0].X, pts[0].Y); LineTo(pts[1].X, pts[1].Y); end;
          eRectangle : Rectangle(Rect(pts[0], pts[1]));
          eRoundRect : RoundRect(Rect(pts[0], pts[1]), 25, 25);
          eFrameRect : FrameRect(Rect(pts[0], pts[1]));
          ePie       : Pie(pts[0].X, pts[0].Y, pts[1].X, pts[1].Y, pts[2].X, pts[2].Y, pts[3].X, pts[3].Y);
          eArc       : Arc(pts[0].X, pts[0].Y, pts[1].X, pts[1].Y, pts[2].X, pts[2].Y, pts[3].X, pts[3].Y);
          eChord     : Chord(pts[0].X, pts[0].Y, pts[1].X, pts[1].Y, pts[2].X, pts[2].Y, pts[3].X, pts[3].Y);
          ePolyLine  : Polyline(pts);
          ePolygon   : Polygon(pts);
          ePolyBezier: PolyBezier(pts);
        end;
    
        {绘制控制点}
        Brush.Style := bsSolid;
        Brush.Color := clRed;
        for pt in pts do if pt.X <> MaxInt then FillRect(Rect(pt.X-4, pt.Y-4, pt.X+4, pt.Y+4));
        EndDraw;
        Free;
      end;
    end;
    
    end.
    


    窗体:

    object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Form1'
      ClientHeight = 348
      ClientWidth = 476
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object ListBox1: TListBox
        Left = 0
        Top = 0
        Width = 129
        Height = 348
        Align = alLeft
        ItemHeight = 13
        TabOrder = 0
        OnClick = ListBox1Click
      end
      object Panel1: TPanel
        Left = 129
        Top = 0
        Width = 347
        Height = 348
        Align = alClient
        Caption = 'Panel1'
        Padding.Top = 10
        TabOrder = 1
        object PaintBox1: TPaintBox
          Left = 1
          Top = 129
          Width = 345
          Height = 218
          Align = alClient
          OnMouseDown = PaintBox1MouseDown
          OnMouseMove = PaintBox1MouseMove
          OnMouseUp = PaintBox1MouseUp
          OnPaint = PaintBox1Paint
          ExplicitLeft = 208
          ExplicitTop = 136
          ExplicitWidth = 105
          ExplicitHeight = 105
        end
        object GroupBox1: TGroupBox
          Left = 1
          Top = 11
          Width = 345
          Height = 62
          Align = alTop
          Caption = 'Pen'
          TabOrder = 0
          object Edit1: TEdit
            Left = 256
            Top = 24
            Width = 48
            Height = 21
            TabOrder = 0
            Text = 'Edit1'
          end
          object UpDown1: TUpDown
            Left = 303
            Top = 22
            Width = 17
            Height = 23
            TabOrder = 1
          end
          object ColorBox1: TColorBox
            Left = 112
            Top = 24
            Width = 114
            Height = 22
            TabOrder = 2
          end
          object CheckBox1: TCheckBox
            Left = 16
            Top = 26
            Width = 97
            Height = 17
            Caption = 'CheckBox1'
            TabOrder = 3
          end
        end
        object GroupBox2: TGroupBox
          Left = 1
          Top = 73
          Width = 345
          Height = 56
          Align = alTop
          Caption = 'Brush'
          TabOrder = 1
          object ColorBox2: TColorBox
            Left = 112
            Top = 22
            Width = 114
            Height = 22
            TabOrder = 0
          end
          object CheckBox2: TCheckBox
            Left = 16
            Top = 24
            Width = 97
            Height = 17
            Caption = 'CheckBox2'
            TabOrder = 1
          end
        end
      end
    end
    


    效果图:



  • 相关阅读:
    索引覆盖与覆盖索引的深入探究
    附加数据库后,数据库状态为只读
    Starting MySQL. ERROR! The server quit without updating PID file(xxx/x.pid)
    【1.4】shell基本实践——根据文件做交互选择
    mysql中count与null的坑
    深入理解yield(二):yield与协程
    深入理解yield(三):yield与基于Tornado的异步回调
    tornado.gen 模块解析
    pip 安装指定版本的python包
    [转]Tornado get/post请求异步处理框架分析
  • 原文地址:https://www.cnblogs.com/del/p/2000412.html
Copyright © 2020-2023  润新知