Firemonkey的旁门左道[三]

时间:2023-01-22 08:24:15


    上次我们发现了  GlobalUseGPUCanvas

  当GlobalUseGPUCanvas := True; 可以没有抗锯齿化,我们这次来对比一下效果。

  左侧是开启的效果,右侧则是没有开启

Firemonkey的旁门左道[三]Firemonkey的旁门左道[三]


  Firmonkey对于抗锯齿化已经做了很好的处理。


  对于抗锯齿化,我们再来看一下效果:

    Canvas.Stroke.Thickness := 0.5;

    Canvas.DrawLine(TPointF.Create(0,20), TPointF.Create(200,20), 1);

    Canvas.Stroke.Thickness := 0.5;

    Canvas.DrawLine(TPointF.Create(0,30-0.1), TPointF.Create(200,30-0.1), 1);

    Canvas.DrawLine(TPointF.Create(0,40-0.5), TPointF.Create(200,40-0.5), 1);

    Canvas.Stroke.Thickness := 1;

    Canvas.DrawLine(TPointF.Create(0,50-0.5), TPointF.Create(200,50-0.5), 1);  //最显眼

    Canvas.DrawLine(TPointF.Create(0,60), TPointF.Create(200,60), 1);

   Firemonkey的旁门左道[三] 

  可以看出,当画笔粗细是1, 点在半个像素点上的时候,线条是最亮的。具体的原因,小弟不才,还没有发现。


  在Firemonkey和VCL中一个比较大的区别是Canvas。

  FMX中,默认所有对象的Canvas是同一个,我们可以在调试的状态中看一下他们的指针就一目了然了。

  左边是FMX下,右边是VCL框架中的地址

 Firemonkey的旁门左道[三]Firemonkey的旁门左道[三]


  FMX中竟然共享一个Canvas,这明显不合理啊? 

  对,其实每个控件都有他们各自的Canvas,SetMatrix就可以方便的切换到各自的坐标系中去了。

PaintBox1.Canvas.BeginScene;

PaintBox1.Canvas.SetMatrix(PaintBox1.AbsoluteMatrix);

PaintBox1.Canvas.DrawRect(TRectF.Create(0,0,PaintBox1.Width, 

PaintBox1.Height), 40, 40, [TCorner.crTopLeft, TCorner.crTopRight], 1, 

TCornerType.ctRound);

PaintBox1.Canvas.DrawLine(TPointF.Create(10,10), TPointF.Create(100,100), 

1);

PaintBox1.Canvas.EndScene;