博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再学 GDI+[14]: DrawBeziers - 绘制一组贝塞尔线
阅读量:7174 次
发布时间:2019-06-29

本文共 2657 字,大约阅读时间需要 8 分钟。

  hot3.png

本例效果图:
26153412_am0o.gif

代码文件:

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs;type  TForm1 = class(TForm)    procedure FormPaint(Sender: TObject);    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;      Shift: TShiftState; X, Y: Integer);    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;      Shift: TShiftState; X, Y: Integer);    procedure FormCreate(Sender: TObject);  end;var  Form1: TForm1;implementation{$R *.dfm}uses GDIPOBJ,GDIPAPI;var  pts: array of TGPPoint;  ptn: Integer = -1;  f: Boolean;procedure TForm1.FormCreate(Sender: TObject);begin  Text := '按住 Ctrl 键可添加点';end;procedure TForm1.FormPaint(Sender: TObject);var  g: TGPGraphics;  p: TGPPen;  i: Integer;begin  g := TGPGraphics.Create(Canvas.Handle);  p := TGPPen.Create(aclRed, 1);  g.Clear(aclWhite);  g.DrawBeziers(p, PGPPoint(pts), Length(pts));  p.SetColor(aclBlue);  for i := Low(pts) to High(pts) do    g.DrawRectangle(p, MakeRect(Rect(pts[i].X-2, pts[i].Y-2, pts[i].X+2, pts[i].Y+2)));  g.Free;  p.Free;end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);begin  f := True;end;procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,  Y: Integer);var  R: TRect;  i: Integer;begin  if f then  begin    if ptn = -1 then Exit;    pts[ptn].X := X;    pts[ptn].Y := Y;    Repaint;  end else begin    ptn := -1;    Cursor := crDefault;    for i := Low(pts) to High(pts) do    begin      R := Rect(pts[i].X-2, pts[i].Y-2, pts[i].X+2, pts[i].Y+2);      if PtInRect(R, Point(X, Y)) then      begin        ptn := i;        Cursor := crHandPoint;      end;    end;  end;end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);begin  f := False;  if ssCtrl in Shift then  begin    SetLength(pts, Length(pts)+1);    pts[High(pts)].X := X;    pts[High(pts)].Y := Y;    Canvas.Pen.Color := clBlue;    Canvas.Rectangle(X-2, Y-2, X+2, Y+2);    {当点数是 3*n+1 时再绘制}    if Length(pts) mod 3 = 1 then Repaint;  end;end;end.
窗体文件:

object Form1: TForm1  Left = 0  Top = 0  Caption = 'Form1'  ClientHeight = 188  ClientWidth = 254  Color = clBtnFace  Font.Charset = DEFAULT_CHARSET  Font.Color = clWindowText  Font.Height = -11  Font.Name = 'Tahoma'  Font.Style = []  OldCreateOrder = False  Position = poDesktopCenter  OnCreate = FormCreate  OnMouseDown = FormMouseDown  OnMouseMove = FormMouseMove  OnMouseUp = FormMouseUp  OnPaint = FormPaint  PixelsPerInch = 96  TextHeight = 13end

转载于:https://my.oschina.net/hermer/blog/319897

你可能感兴趣的文章
COM结构化存储中存储对象或者流对象的命名规则
查看>>
iOS开发基础知识--碎片26
查看>>
制作鼠标移动到div上面显示弹出框
查看>>
java既然存在gc线程,为什么还存在内存泄漏?
查看>>
Linux Vim
查看>>
UVA - 11987 Almost Union-Find[并查集 删除]
查看>>
使用css开启硬件加速提高网站性能
查看>>
CMakeLists.txt的写法
查看>>
Flask如何使用https?
查看>>
Linux命令之kill
查看>>
Asp.Net SignalR Hub类中的操作详解
查看>>
附上解决迅雷9及迅雷极速版任何资源下载任务出错、内容违规问题
查看>>
hadoop3: mkdir: cannot create directory `/usr/local/hadoop/bin/../logs’: Permission denied
查看>>
高阶函数与面向对象继承的比较
查看>>
群雄逐鹿的移动互联网时代【转载】
查看>>
【排序】InsertSort
查看>>
[c++11]多线程编程(五)——unique_lock
查看>>
高程3总结#第15章使用Canvas绘图
查看>>
【go并发编程】
查看>>
实验吧——隐写术之流
查看>>