博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再学 GDI+[11]: DrawCurve - 绘制曲线
阅读量:5997 次
发布时间:2019-06-20

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

  hot3.png

本例效果图:
26153607_oLXc.gif

代码文件:

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ComCtrls, ExtCtrls;type  TForm1 = class(TForm)    Button1: TButton;    TrackBar1: TTrackBar;    LabeledEdit1: TLabeledEdit;    LabeledEdit2: TLabeledEdit;    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;      Shift: TShiftState; X, Y: Integer);    procedure FormPaint(Sender: TObject);    procedure FormCreate(Sender: TObject);    procedure Button1Click(Sender: TObject);    procedure TrackBar1Change(Sender: TObject);    procedure LabeledEdit1Change(Sender: TObject);    procedure LabeledEdit2Change(Sender: TObject);  end;var  Form1: TForm1;implementation{$R *.dfm}uses GDIPOBJ, GDIPAPI;var  PtArr: array of TGPPoint;  i: Integer = 0;  tension: Single;procedure TForm1.FormCreate(Sender: TObject);begin  Button1.Caption := '擦除';  LabeledEdit1.EditLabel.Caption := '起始点';  LabeledEdit2.EditLabel.Caption := '有效点数';  LabeledEdit1.Text := '0';  LabeledEdit2.Text := '0';  TrackBar1.ShowSelRange := False;  TrackBar1.Min := -25;  TrackBar1.Max := 35;  TrackBar1.Position := 5;end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);begin  Inc(i);  SetLength(PtArr, i);  PtArr[i-1].X := X;  PtArr[i-1].Y := Y;  LabeledEdit2.Text := IntToStr(i-1);  Text := IntToStr(i);  Repaint;end;procedure TForm1.FormPaint(Sender: TObject);var  g: TGPGraphics;  p: TGPPen;  i,n1,n2: Integer;begin  g := TGPGraphics.Create(Canvas.Handle);  p := TGPPen.Create(aclRed, 2);  g.Clear(aclWhite);  n1 := StrToIntDef(LabeledEdit1.Text, 0);  n2 := StrToIntDef(LabeledEdit2.Text, Length(PtArr)-1);  {后面三个参数是可选的, 最后参数的默认值是 0.5, 为 0 时曲线会转为直线段}  g.DrawCurve(p, PGPPoint(PtArr), Length(PtArr), n1, n2, tension);  p.SetWidth(1);  p.SetColor(aclBlack);  for i := 0 to Length(PtArr) - 1 do    g.DrawEllipse(p, PtArr[i].X-2, PtArr[i].Y-2, 4, 4);  g.Free;  p.Free;end;procedure TForm1.LabeledEdit1Change(Sender: TObject);var  a,b: Integer;begin  a := StrToIntDef(LabeledEdit1.Text, 0);  if (a < 0) or (a > Length(PtArr) - 2) then    LabeledEdit1.Text := IntToStr(0);  a := StrToIntDef(LabeledEdit1.Text, 0);  b := StrToIntDef(LabeledEdit2.Text, 0);  if a+b > Length(PtArr)-1 then    LabeledEdit2.Text := IntToStr(Length(PtArr)-1-a);  Repaint;end;procedure TForm1.LabeledEdit2Change(Sender: TObject);var  a,b: Integer;begin  a := StrToIntDef(LabeledEdit1.Text, 0);  b := StrToIntDef(LabeledEdit2.Text, 0);  if (b < 0) or (b >= Length(PtArr) - a) then    LabeledEdit2.Text := IntToStr(Length(PtArr)-1-a);  Repaint;end;procedure TForm1.TrackBar1Change(Sender: TObject);begin  tension := TrackBar1.Position / 10;  Repaint;end;procedure TForm1.Button1Click(Sender: TObject);begin  i := 0;  SetLength(PtArr, i);  Repaint;  Text := IntToStr(i);end;end.
窗体文件:

object Form1: TForm1  Left = 0  Top = 0  Caption = 'Form1'  ClientHeight = 187  ClientWidth = 264  Color = clBtnFace  Font.Charset = DEFAULT_CHARSET  Font.Color = clWindowText  Font.Height = -11  Font.Name = 'Tahoma'  Font.Style = []  OldCreateOrder = False  Position = poDesktopCenter  OnCreate = FormCreate  OnMouseUp = FormMouseUp  OnPaint = FormPaint  PixelsPerInch = 96  TextHeight = 13  object Button1: TButton    Left = 181    Top = 155    Width = 75    Height = 25    Caption = 'Button1'    TabOrder = 0    OnClick = Button1Click  end  object TrackBar1: TTrackBar    Left = 8    Top = 155    Width = 167    Height = 25    TabOrder = 1    OnChange = TrackBar1Change  end  object LabeledEdit1: TLabeledEdit    Left = 208    Top = 54    Width = 48    Height = 21    EditLabel.Width = 61    EditLabel.Height = 13    EditLabel.Caption = 'LabeledEdit1'    TabOrder = 2    OnChange = LabeledEdit1Change  end  object LabeledEdit2: TLabeledEdit    Left = 208    Top = 102    Width = 48    Height = 21    EditLabel.Width = 61    EditLabel.Height = 13    EditLabel.Caption = 'LabeledEdit2'    TabOrder = 3    OnChange = LabeledEdit2Change  endend

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

你可能感兴趣的文章
我的友情链接
查看>>
RHEL6 安装完iscsi 后,服务为什么启不来?
查看>>
SQLSERVER中CPU超线程的支持
查看>>
思科服务查询,软件下载,各种支持。
查看>>
mysql常用命令
查看>>
克隆远程仓库#180804
查看>>
我的javaweb学习之旅--html结构
查看>>
VRRP 协议
查看>>
Linux 下查看服务器CPU核数
查看>>
python 默认函数
查看>>
如何给FineReport设置自定义消息提醒工具
查看>>
查看SELinux状态&关闭SELinux
查看>>
MySQL中的JSON
查看>>
Fragment
查看>>
在RHEL5.3上配置基本的Nagios系统(使用Nagios-3.1.2)
查看>>
中兴个人通信费自定科目
查看>>
烂泥:使KVM显示VM的IP地址及主机名
查看>>
线程池,ThreadPoolExecutor 源码分析
查看>>
学习IT
查看>>
Micropython教程之TPYBoard DIY电子时钟(萝卜学科编程教育)
查看>>