再学 GDI+[13] DrawBezier - 绘制贝塞尔线
2010-12-31 10:57
260 查看
unit Unit1; interface uses 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); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses GDIPOBJ,GDIPAPI; var //定义4个指针变量,并赋予初值 pts:array[0..3] of TGPPoint = ((x:30;y:100),(x:120;y:10),(x:170;y:150),(x:220;y:100)); ptn:Integer = -1; flag:Boolean; //定义标志变量,它决定了是否该绘画 procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin flag:=True; //鼠标左键被按下,可以绘画了,所以标志位致True end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var R:TRect; i:Integer; begin if flag then begin if ptn = -1 then Exit; pts[ptn].X:=x; //如果鼠标按下,同时还命中了以四个坐标点所画的蓝色矩形,那么保存移动到的新位置 pts[ptn].Y:=y; Repaint; end else //-----------------鼠标在客户区移动而没有按下鼠标左键时执行以下代码---------------------------- begin ptn:=-1; for I := 0 to 3 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 ptn:=i; //PtInRect是矩形命中函数,参数1是个矩形,参数2是个坐标 end; end; //------------------如果鼠标移动到任何一个蓝色矩形,那么么ptn就有正值(不是-1)了, //-------------------而当鼠标左键按下同时又命中蓝色矩形时,这部分代码就暂时不执行了------------- end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin flag:=False; //鼠标左键抬起就不再画了,所以标志位致False end; procedure TForm1.FormPaint(Sender: TObject); var g:TGPGraphics; p:TGPPen; i:Integer; begin Form1.DoubleBuffered:=True; g:=TGPGraphics.Create(Canvas.Handle); g.Clear(aclWhite); p:=TGPPen.Create(aclRed,1); g.DrawBezier(p,pts[0],pts[1],pts[2],pts[3]); //根据4个坐标点变量画塞贝尔曲线 p.SetColor(aclBlue); //画笔颜色设为蓝色并开始逐个按4个坐标点变量画4个很小的矩形 for I := 0 to 3 do begin g.DrawRectangle(p,MakeRect(Rect(pts[i].X-2,pts[i].Y-2,pts[i].X+2,pts[i].Y+2))); end; p.Free; g.Free; end; end.
相关文章推荐
- 再学 GDI+[13]: DrawBezier - 绘制贝塞尔线
- 再学 GDI+[14]: DrawBeziers - 绘制一组贝塞尔线
- 再学 GDI+[9]: DrawPolygon - 绘制多边形
- Delphi下的GDI+编程[10] 绘制饼形-DrawPie
- 再学 GDI+[10]: DrawClosedCurve - 绘制闭合曲线
- Cocos2d-x学习笔记(13)(draw绘制)
- 再学 GDI+[11]: DrawCurve - 绘制曲线
- 再学 GDI+[9] DrawPolygon - 绘制多边形
- 再学 GDI+[10] DrawClosedCurve - 绘制闭合曲线
- 再学 GDI+[14] DrawBeziers - 绘制一组贝塞尔线
- WinAPI: PolyBezierTo - 绘制贝塞尔线(更新当前位置)
- 再学 GDI+[6]: DrawPie - 绘制饼形
- caffe:使用draw_net.py绘制网络架构
- 再学 GDI+[7]: DrawLines - 绘制一组直线
- DrawMouseEvent.py 拖动鼠标时绘制矩形或者是圆圈
- caffe利用draw_net.py绘制net结构
- GDI+在固定位置(固定点)的地方绘制文本
- 使用Canvas的drawTextOnPath方法实现沿着Path绘制文本
- ExtJs4 笔记(13) Ext.menu.Menu 菜单、Ext.draw.Component 绘图、Ext.resizer.Resizer 大小变更
- 绘制饼图DrawPie