文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:36
字数 524
阅读 30
收藏 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

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
Quartz2D IOS绘图 线 椭圆 矩形 贝塞尔曲线 弧

// // ViewController.m // Quartz2D // // Created by dc008 on 15/12/7. // Copyright © 2015年 CXY. All rights reserved. // #import "ViewController.h" #import "CuiXiaoYu.h" @inter......

温暖c
2015/12/07
37
0
用C#的GDI+技术生成复杂型彩色验证码

该类是生成一个验证码的类。本人集合了网上大部分的C#关于GDI+的文章进行多次改进,现在已经形成了可在生产环节中使用的验证码。 该验证码加入了背景噪点,背景噪点曲线和直线,背景噪点文字...

Minho
2012/12/13
0
2
C# chart控件绘制曲线

在.NET中以前经常用GDI去绘制,虽然效果也不错,自从.NET 4.0开始,专门为绘制图表而生的Chart控件出现了,有了它,就可以轻松的绘制你所需要的曲线图、柱状图什么的了。 参考文章 1. 使用....

橘子红了呐
2017/11/07
0
0
CGContextRef UI界面美化

#import "Birongchao.h" @implementation Birongchao - (void)drawRect:(CGRect)rect { NSLog(@"drawRect 被调用了!"); [self drawLine]; CGContextRef context = UIGraphicsGetCurrentCon......

TimeConcept
2015/12/07
41
0
实战开发:新手小白如何用C++制作经典网游DNF

十年前,那时候的网吧还不叫网咖,那时候没有王者荣耀也没有英雄联盟,那时候梦幻西游刚推出珍宝阁系统,那时候巫妖王的灵魂还封闭在冰封王座。 寻仙、穿越火线、征途、天龙八部……同时在线...

stone15165
05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker快速搭建几个常用的第三方服务

本次和大家分享的内容是使用docker快速搭建工作中常用的第三方的服务,对于有一些互联网背景的公司来说,以下几个服务都是很需要的:redis,rabbit,elasticsearch; 如果想学习Java工程化、...

编程SHA
33分钟前
3
0
我的Linux系统九阴真经

在今天,互联网的迅猛发展,科技技术也日新月异,各种编程技术也如雨后春笋一样,冒出尖来了。各种创业公司也百花齐放百家争鸣,特别是针对服务行业,新型互联网服务行业,共享经济等概念的公...

linuxprobe16
41分钟前
12
0
Dubbo标签解析详解

在Spring继承dubbo时,会使用dubbo自定义的标签来定义相关的属性,常见的标签有<dubbo:application/>,<dubbo:registry/>,<dubbo:service/>等。对于这些标签的解析,dubbo都是使用的统一的方...

爱宝贝丶
46分钟前
5
0
网站彩蛋

图形类彩蛋 知乎 https://www.zhihu.com/ 想来知乎工作?请发送邮件到 jobs@zhihu.com 天猫 https://www.tmall.com/ 喵~ 加入我们吧 http://tb.cn/iS8NBOy 超级课程表 http://www.super.cn/...

临江仙卜算子
54分钟前
10
0
ThreadLocal父子线程之间的数据传递问题

一、问题的提出 在系统开发过程中常使用ThreadLocal进行传递日志的RequestId,由此来获取整条请求链路。然而当线程中开启了其他的线程,此时ThreadLocal里面的数据将会出现无法获取/读取错乱...

nonnetta
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部