文档章节

再学 GDI+[11]: DrawCurve - 绘制曲线

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 524
阅读 718
收藏 0

阿里云携手百名商业领袖、技术大咖,带您一探行进中的数字新基建!>>>

本例效果图:



代码文件:
unit Unit1;

interface

uses
  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
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/06/09/1216425.html

涂孟超
粉丝 13
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
加载中

评论(0)

戏说 .NET GDI+系列学习教程(二、Graphics类的方法)

一、DrawBezier 画立体的贝尔塞曲线 private void frmGraphics_Paint(object sender, PaintEventArgs e) //DrawBezier有多种重载这里就不一一说明了 g.DrawBezier(blackPen, start, control1......

osc_kzwkjl9k
2019/07/04
1
0
戏说 .NET GDI+系列学习教程(一、Graphics类--纸)

Graphics类(纸) Graphics类封装一个GDI+绘图图面,提供将对象绘制到显示设备的方法,Graphics与特定的设备上下文关联。 画图方法都被包括在Graphics类中,在画任何对象时,我们首先要创建一...

osc_eibr31r7
04/16
4
0
C# GDI+之Graphics类 z

GDI+是GDI的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像、数学仿真等。   Graphics类是GDI+的核心,它提供将...

osc_c0j5n5bj
2019/03/01
9
0
从零开始学习GDI+ (二) 基本概念与基本操作

从零开始学习GDI+ (一)我的第一个GDI+程序 上文给新手学习GDI+讲述了vs环境等的准备工作,并且可以直接用GDI+绘图了。本文开始,讲述的可能偏理论,建议学习的过程中大胆尝试,多使用API。...

osc_bkdv2it5
2019/08/20
1
0
C# GDI+之Graphics类 z

GDI+是GDI的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像、数学仿真等。   Graphics类是GDI+的核心,它提供将...

武胜-阿伟
2019/03/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

史上最全的“文件或目录损坏且无法读取”的解决办法大集合

问题描述: G盘打不开文件或目录损坏且无法读取,是因为这个I盘的文件系统内部结构损坏导致的。史上最全的“文件或目录损坏且无法读取”的解决办法大集合具体的恢复方法看正文 工具/软件:极...

计算无敌
今天
9
0
2048游戏的最佳算法是什么? - What is the optimal algorithm for the game 2048?

问题: I have recently stumbled upon the game 2048 . 我最近偶然发现了2048游戏。 You merge similar tiles by moving them in any of the four directions to make "bigger" tiles. 您可......

javail
今天
9
0
Spring Cloud Ribbon 客户端负载均衡

Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等,内置可插拔、可定制的负载均衡组件。下面是用到的一些负载均衡策略: 简单轮询负载均衡 加权轮询负载均衡 区域...

泥瓦匠BYSocket
今天
7
0
为什么在Python 3中“范围(1000000000000000(1000000000000001))”这么快?

问题: It is my understanding that the range() function, which is actually an object type in Python 3 , generates its contents on the fly, similar to a generator. 据我了解, ra......

技术盛宴
今天
9
0
OSChina 周四乱弹 —— 卖全家桶!

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @巴拉迪维 :陈慧娴的单曲《与泪抱拥》 陈慧娴的嗓音加上向雪怀的词,这样的经典组合真不多。#今日歌曲推荐# 《与泪抱拥》- 陈慧娴 手机党少年...

小小编辑
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部