DelphiXE FireMonkey 如何画图

相关资料:

https://stackoverflow.com/questions/10291330/firemonkey-penmode-equivalent-drawline

https://blog.csdn.net/shuaihj/article/details/8444676

http://www.delphitop.com/html/FMX/2646.html

http://docwiki.embarcadero.com/CodeExamples/Rio/en/FMXTCanvasDrawFunctions_(Delphi)

CSDN代码下载:

https://download.csdn.net/download/zhujianqiangqq/12394005

代码实例:

  1 {
  2 相关资料:
  3 http://www.delphitop.com/html/FMX/2646.html
  4 http://docwiki.embarcadero.com/CodeExamples/Rio/en/FMXTCanvasDrawFunctions_(Delphi)
  5 
  6 FMX 的 Canvas 在不同的系统上会分别使用:
  7 WinVista、Win7: D2D (FMX.Canvas.D2D.pas)
  8 WinXP: GDI+ (FMX.Canvas.GDIP.pas)
  9 Mac 系列: Core Graphics (FMX.Canvas.Mac.pas)
 10 
 11 和 HTML5 中的 Canvas 非常类似, 现在的 Canvas 模糊了 Pen 的概念:
 12 之前的 Canvas.Pen 对应: Canvas.Stroke;
 13 之前的 Canvas.Brush 对应: Canvas.Fill.
 14 
 15 在 FMX 中, Canvas 无处不在, 其 Canvas.Stroke、Canvas.Fill 的状态也各不相同, 一般要先初始化它们.
 16 }
 17 unit Unit1;
 18 
 19 interface
 20 
 21 uses
 22   System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
 23   FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
 24   FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListBox, FMX.Edit, FMX.ComboEdit,
 25   FMX.Colors;
 26 
 27 type
 28   TMYStyle = record
 29     StrokeColor: TAlphaColor;
 30     StrokeThickness: Integer;
 31     StrokeCap: TStrokeCap;
 32     StrokeDash: TStrokeDash;
 33      StrokeJoin: TStrokeJoin;
 34     FillColor: TAlphaColor;
 35     FontSize: Integer;
 36   end;
 37   TForm1 = class(TForm)
 38     Image1: TImage;
 39     DrawLine: TButton;
 40     DrawEllipse: TButton;
 41     DrawArc: TButton;
 42     DrawBitmap: TButton;
 43     GroupBox1: TGroupBox;
 44     Label1: TLabel;
 45     StrokeColor: TColorComboBox;
 46     Label2: TLabel;
 47     Label3: TLabel;
 48     Label4: TLabel;
 49     Label5: TLabel;
 50     Label6: TLabel;
 51     Label7: TLabel;
 52     StrokeThickness: TEdit;
 53     StrokeCap: TComboBox;
 54     StrokeDash: TComboBox;
 55     StrokeJoin: TComboBox;
 56     FillColor: TColorComboBox;
 57     FontSize: TEdit;
 58     scFlat: TListBoxItem;
 59     scRound: TListBoxItem;
 60     sjMiter: TListBoxItem;
 61     sjRound: TListBoxItem;
 62     sjBevel: TListBoxItem;
 63     GroupBox2: TGroupBox;
 64     DrawRectSides: TButton;
 65     DrawRect: TButton;
 66     Edit3: TEdit;
 67     FillText: TButton;
 68     Claer: TButton;
 69     DrawPath: TButton;
 70     DrawPolygon: TButton;
 71     CreateThumbnail: TButton;
 72     OpenDialog1: TOpenDialog;
 73     procedure DrawLineClick(Sender: TObject);
 74     procedure ClaerClick(Sender: TObject);
 75     procedure DrawRectSidesClick(Sender: TObject);
 76     procedure Image1Paint(Sender: TObject; Canvas: TCanvas;
 77       const ARect: TRectF);
 78     procedure FormCreate(Sender: TObject);
 79     procedure DrawArcClick(Sender: TObject);
 80     procedure DrawBitmapClick(Sender: TObject);
 81     procedure DrawEllipseClick(Sender: TObject);
 82     procedure DrawPathClick(Sender: TObject);
 83     procedure DrawPolygonClick(Sender: TObject);
 84     procedure DrawRectClick(Sender: TObject);
 85     procedure CreateThumbnailClick(Sender: TObject);
 86     procedure FillTextClick(Sender: TObject);
 87     procedure StrokeColorChange(Sender: TObject);
 88   private
 89     { Private declarations }
 90     procedure SetMYStyle;
 91   public
 92     { Public declarations }
 93   end;
 94 
 95 var
 96   Form1: TForm1;
 97   oStyle: TMYStyle;
 98 
 99 implementation
100 uses
101   System.UIConsts,
102   System.Math.Vectors;
103 
104 {$R *.fmx}
105 {$R *.LgXhdpiPh.fmx ANDROID}
106 
107 procedure TForm1.DrawLineClick(Sender: TObject);
108 var
109   p1, p2: TPointF;
110 begin
111   // sets the ends of the line to be drawn
112   p1 := TPointF.Create(20, 2);
113   p2 := TPointF.Create(350, 400);
114   Image1.Bitmap.Canvas.BeginScene;
115   SetMYStyle;
116   // draws the line on the canvas
117   Image1.Bitmap.Canvas.DrawLine(p1, p2, 100);
118   Image1.Bitmap.Canvas.EndScene;
119 end;
120 
121 procedure TForm1.DrawPathClick(Sender: TObject);
122 var
123   path: TPathData;
124   MyRect1, MyRect2: TRectF;
125 begin
126   // set the circumscribed rectangle of the ellipse to be add in the path
127   MyRect1 := TRectF.Create(90, 100, 230, 300);
128   /// sets the rectangle to be add in the path
129   MyRect2 := TRectF.Create(70, 90, 220, 290);
130   // initializes and creates the path to be drawn
131   path := TPathData.Create;
132   path.AddEllipse(MyRect1);
133   path.AddRectangle(MyRect2, 0, 0, AllCorners);
134   Image1.Bitmap.Canvas.BeginScene;
135   SetMYStyle;
136   // draws the path on the canvas
137   Image1.Bitmap.Canvas.DrawPath(path, 200);
138   Image1.Bitmap.Canvas.EndScene;
139 end;
140 
141 procedure TForm1.DrawPolygonClick(Sender: TObject);
142 var
143   p1, p2, p3, p4, p5, p6: TPointF;
144   MyPolygon: TPolygon; //System.Math.Vectors unit needed.
145 begin
146   // sets the points that define the polygon
147   p1 := TPointF.Create(80, 200);
148   p2 := TPointF.Create(225, 30);
149   p3 := TPointF.Create(370, 200);
150   p4 := TPointF.Create(300, 340);
151   p5 := TPointF.Create(150, 340);
152   p6 := TPointF.Create(80, 200);
153   // creates the polygon
154   SetLength(MyPolygon, 6);
155   MyPolygon[0] := p1;
156   MyPolygon[1] := p2;
157   MyPolygon[2] := p3;
158   MyPolygon[3] := p4;
159   MyPolygon[4] := p5;
160   MyPolygon[5] := p6;
161   Image1.Bitmap.Canvas.BeginScene;
162   SetMYStyle;
163   // draws the polygon on the canvas
164   Image1.Bitmap.Canvas.DrawPolygon(MyPolygon, 50);
165   Image1.Bitmap.Canvas.EndScene;
166 end;
167 
168 procedure TForm1.DrawRectClick(Sender: TObject);
169 var
170   MyRect: TRectF;
171 begin
172   // sets the rectangle to be drawn
173   MyRect := TRectF.Create(50, 40, 200, 270);
174   Image1.Bitmap.Canvas.BeginScene;
175   SetMYStyle;
176   // draws the rectangle on the canvas
177   Image1.Bitmap.Canvas.DrawRect(MyRect, 30, 60, AllCorners, 100);
178   Image1.Bitmap.Canvas.EndScene;
179 end;
180 
181 procedure TForm1.CreateThumbnailClick(Sender: TObject);
182 var
183   MyBitmap: TBitmap;
184 begin
185   // loads the bitmap using the TOpenDialog.
186   if OpenDialog1.Execute then
187     MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]);
188   // draws a thumbnail with given sizes
189   Image1.Bitmap :=  MyBitmap.CreateThumbnail(300,300);
190 end;
191 
192 procedure TForm1.DrawArcClick(Sender: TObject);
193 var
194   p1, p2: TPointF;
195 begin
196   // Sets the center of the arc
197   p1 := TPointF.Create(200, 200);
198   // sets the radius of the arc
199   p2 := TPointF.Create(150, 150);
200   Image1.Bitmap.Canvas.BeginScene;
201   SetMYStyle;
202   // draws the arc on the canvas
203   Image1.Bitmap.Canvas.DrawArc(p1, p2, 90, 230, 20);
204   // updates the bitmap to show the arc
205   Image1.Bitmap.Canvas.EndScene;
206 end;
207 
208 procedure TForm1.DrawBitmapClick(Sender: TObject);
209 var
210   // MyBitmap is the bitmap to be drawn on the canvas
211   MyBitmap: TBitmap;
212   // is the area where to draw the bitmap
213   // also is the area of the bitmap to be drawn on the canvas
214   MyRect: TRectF;
215 begin
216   // loads the bitmap using the TOpenDialog.
217   if OpenDialog1.Execute then
218     MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]);
219   // set the  MyRect coordinates
220   MyRect := TRectF.Create(0, 0, 150, 200);
221   Image1.Bitmap.Canvas.BeginScene;
222   SetMYStyle;
223   // draws on the rectangle specified by MyRect the area from MyBitmap specified by MyRect
224   Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20);
225   Image1.Bitmap.Canvas.EndScene;
226 end;
227 
228 procedure TForm1.DrawEllipseClick(Sender: TObject);
229 var
230   MyRect: TRectF;
231 begin
232   // sets the circumscribed rectangle of the ellipse
233   MyRect := TRectF.Create(50, 40, 200, 270);
234   // draws the ellipse on the canvas
235   Image1.Bitmap.Canvas.BeginScene;
236   SetMYStyle;
237   Image1.Bitmap.Canvas.DrawEllipse(MyRect, 40);
238   Image1.Bitmap.Canvas.EndScene;
239 end;
240 
241 procedure TForm1.DrawRectSidesClick(Sender: TObject);
242 var
243   MyRect: TRectF;
244 begin
245   // sets the rectangle to be customized and drawn
246   MyRect := TRectF.Create(50, 40, 200, 270);
247   Image1.Bitmap.Canvas.BeginScene;
248   SetMYStyle;
249   // customize the rectangle and draws it on the canvas
250   Image1.Bitmap.Canvas.DrawRectSides(MyRect, 50, 20, AllCorners, 40, AllSides,
251     TCornerType.Bevel);
252   Image1.Bitmap.Canvas.EndScene;
253 end;
254 
255 procedure TForm1.FillTextClick(Sender: TObject);
256 var
257   MyRect: TRectF;
258 begin
259   // sets the rectangle to be customized and drawn
260   MyRect := TRectF.Create(0, 0, 100, 200);
261   Image1.Bitmap.Canvas.BeginScene;
262   SetMYStyle;
263   Image1.Bitmap.Canvas.FillText(MyRect, Edit3.Text, false, 100, [], TTextAlign.taLeading, TTextAlign.taCenter);
264   Image1.Bitmap.Canvas.EndScene;
265 end;
266 
267 procedure TForm1.ClaerClick(Sender: TObject);
268 begin
269   Image1.Bitmap.Clear(TAlphaColors.White);
270 end;
271 
272 procedure TForm1.FormCreate(Sender: TObject);
273 begin
274   SetMYStyle;
275   //第一种方式
276 //  Self.OnPaint := Image1.OnPaint;
277 //  Button1.OnPaint := Image1.OnPaint;
278 //  Image1.Opacity := 0.75;
279   //第2种方式
280   Image1.Bitmap.SetSize(Round(Image1.Width), Round(Image1.Height));
281   Image1.Bitmap.Clear(TAlphaColors.White);
282 end;
283 
284 procedure TForm1.Image1Paint(Sender: TObject; Canvas: TCanvas;
285   const ARect: TRectF);
286 var
287   //图片
288   oBMP: TBitmap;
289   //路径
290   oPath: TPathData;
291   MyRect1, MyRect2: TRectF;
292   //多边形
293   p1, p2, p3, p4, p5, p6: TPointF;
294   MyPolygon: TPolygon; //System.Math.Vectors unit needed.
295 begin
296 //下面的代码是第二种方式,上面几个按钮事件是第一种方式。都可以
297 //  //图片
298 //  oBMP := TBitMap.Create;
299 //  oBMP.LoadFromFile('....123.bmp');
300 //  //路径
301 //  MyRect1 := TRectF.Create(90, 100, 230, 300);
302 //  MyRect2 := TRectF.Create(70, 90, 220, 290);
303 //  oPath := TPathData.Create();
304 //  oPath.AddEllipse(MyRect1);
305 //  oPath.AddRectangle(MyRect2, 0, 0, AllCorners);
306 //  //多边形
307 //  p1 := TPointF.Create(80, 200);
308 //  p2 := TPointF.Create(225, 30);
309 //  p3 := TPointF.Create(370, 200);
310 //  p4 := TPointF.Create(300, 340);
311 //  p5 := TPointF.Create(150, 340);
312 //  p6 := TPointF.Create(80, 200);
313 //
314 //  SetLength(MyPolygon, 6);
315 //  MyPolygon[0] := p1;
316 //  MyPolygon[1] := p2;
317 //  MyPolygon[2] := p3;
318 //  MyPolygon[3] := p4;
319 //  MyPolygon[4] := p5;
320 //  MyPolygon[5] := p6;
321 //
322 //  Canvas.Stroke.Kind := TBrushKind.bkSolid;
323 //  Canvas.Stroke.Color := StrokeColor.Color;
324 //  Canvas.Fill.Color := FillColor.Color;
325 //  Canvas.Font.Size := 30;
326 //  //画直线
327 //  Canvas.DrawLine(ARect.Location, ARect.BottomRight, 1);
328 //  //画矩形; 集合 TCorners: 四个角是否使用指定的样式类型; 枚举 TCornerType: 角样式类型
329 //  Canvas.DrawRect(RectF(ARect.Width/4, ARect.Height/4, ARect.Width/4*2, ARect.Height/4*2), 0.5, 0.5, [TCorner.TopLeft], 1, TCornerType.Round);
330 //  //画矩形边; 集合 TSides 指定要画的边
331 //  Canvas.DrawRectSides(RectF(ARect.Width/3, ARect.Height/3, ARect.Width/3*4, ARect.Height/3*4), 0.5, 0.5,[TCorner.TopLeft], 1, [TSide.Left], TCornerType.Round);
332 //  //画椭圆
333 //  Canvas.DrawEllipse(RectF(ARect.Width/2, ARect.Height/2, ARect.Width/2*2, ARect.Height/2*2), 1);
334 //  //画弧
335 //  Canvas.DrawArc(ARect.TopLeft, ARect.BottomRight/2, 40, 40, 1);
336 //  //画路径
337 //  Canvas.DrawPath(oPath, 200);
338 //  //画多边形
339 //  Canvas.DrawPolygon(MyPolygon, 50);
340 //  //图片
341 //  Canvas.DrawBitmap(oBMP,
342 //                    RectF(0, 0, oBMP.Width, oBMP.Height),
343 //                    RectF(100, 100, 100 + oBMP.Width, 100 + oBMP.Height),
344 //                    1);
345 
346 //  //填充矩形
347 //  Canvas.FillRect();
348 //  //填充椭圆
349 //  Canvas.FillEllipse(RectF(ARect.Width/2, ARect.Height/2, ARect.Width/2*2, ARect.Height/2*2), 1);
350 //  //填充弧
351 //  Canvas.FillArc(ARect.TopLeft, ARect.BottomRight/2, 40, 40, 1);
352 //  //填充路径
353 //  Canvas.FillPath(oPath, 200);
354 //  //填充多边形
355 //  Canvas.FillPolygon(MyPolygon, 50);
356 //  //文本输出
357 //  Canvas.FillText(ARect, 'TEST测试字符串', True, 1, [], TTextAlign.taLeading, TTextAlign.taCenter);
358 //  oBMP.Free
359 end;
360 
361 procedure TForm1.SetMYStyle;
362 begin
363   oStyle.StrokeColor := StrokeColor.Color;
364   oStyle.StrokeThickness := StrToInt(StrokeThickness.Text);
365   case StrokeCap.ItemIndex of
366     0: oStyle.StrokeCap := TStrokeCap.Flat;
367     1: oStyle.StrokeCap := TStrokeCap.Round;
368   end;
369     case StrokeDash.ItemIndex of
370     0: oStyle.StrokeDash := TStrokeDash.Solid;
371     1: oStyle.StrokeDash := TStrokeDash.Dash;
372     2: oStyle.StrokeDash := TStrokeDash.Dot;
373     3: oStyle.StrokeDash := TStrokeDash.DashDot;
374     4: oStyle.StrokeDash := TStrokeDash.DashDotDot;
375     5: oStyle.StrokeDash := TStrokeDash.Custom;
376   end;
377    case StrokeJoin.ItemIndex of
378     0: oStyle.StrokeJoin := TStrokeJoin.Miter;
379     1: oStyle.StrokeJoin := TStrokeJoin.Round;
380     2: oStyle.StrokeJoin := TStrokeJoin.Bevel;
381   end;
382   oStyle.FillColor := FillColor.Color;
383   oStyle.FontSize := StrToInt(FontSize.Text);
384 
385   Image1.Bitmap.Canvas.Stroke.Kind := TBrushKind.bkSolid;
386   Image1.Bitmap.Canvas.Stroke.Color := oStyle.StrokeColor;
387   Image1.Bitmap.Canvas.Stroke.Thickness := oStyle.StrokeThickness;
388   Image1.Bitmap.Canvas.Stroke.Cap := oStyle.StrokeCap;
389   Image1.Bitmap.Canvas.Stroke.Dash := oStyle.StrokeDash;
390   Image1.Bitmap.Canvas.Stroke.Join := oStyle.StrokeJoin;
391 
392   Image1.Bitmap.Canvas.Fill.Color := oStyle.FillColor;
393   Image1.Bitmap.Canvas.Font.Size := oStyle.FontSize;
394   Image1.Bitmap.Canvas.Font.Style := [];
395 end;
396 
397 procedure TForm1.StrokeColorChange(Sender: TObject);
398 begin
399   SetMYStyle;
400 end;
401 
402 end.
原文地址:https://www.cnblogs.com/FKdelphi/p/12837201.html