gpt4 book ai didi

delphi - 如何在Firemonkey中绘制虚线?

转载 作者:行者123 更新时间:2023-12-03 15:49:53 25 4
gpt4 key购买 nike

我想在 Firemonkey 项目中的 TPaintbox Canvas 上绘制点状网格,结果应该如下所示:

enter image description here

首先,我想先绘制垂直虚线,然后绘制水平虚线,因此考虑到这一点,我尝试先绘制一条线,以使外观恰到好处,这就是我尝试过的:

Canvas.Stroke.Color := TAlphaColorRec.Black;
Canvas.Stroke.Dash := TStrokeDash.Dot;
Canvas.Stroke.Kind := TBrushKind.Solid;
Canvas.Stroke.Thickness := 1;
Canvas.DrawLine(PointF(0, 0), PointF(0, 150), 1);

结果不是我所希望的,事实上 TLine 形状可以按照我想要的方式绘制虚线:

enter image description here

但是我需要自己在 Canvas 上进行绘制,而不是使用其他控件。根据记录,TLine 只需将 Stroke.Dash 属性更改为 Dot。

那么,在 Firemonkey 项目中使用 Canvas ,我如何绘制与 TLine 相同的虚线,以便我可以像第一个示例图像一样绘制网格?

最佳答案

无需深入了解“为什么它有效”,您可以通过在坐标上添加(或减去)一半线宽来实现 1 像素虚线(如 TLine 中)。我在追踪 TLine 的作用时得到了这个想法;在渲染期间它使用

InflateRect(Result, -(FStroke.Thickness / 2), -(FStroke.Thickness / 2));

对线坐标应用 0.5 修改,得到相同的结果。

procedure TForm24.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
a: integer;
begin
Canvas.BeginScene;
try
Canvas.Stroke.Dash := TStrokeDash.Dot;

for a := 0 to 10 do
Canvas.DrawLine(PointF(a * 20 + 0.5, 0.5), PointF(a * 20 + 0.5, 200.5), 1);

for a := 0 to 10 do
Canvas.DrawLine(PointF(0.5, a * 20 + 0.5), PointF(200.5, a * 20 + 0.5), 1);

Canvas.DrawLine(PointF(0.5, 0.5), PointF(200.5, 200.5), 1);
Canvas.DrawEllipse(RectF(5.0, 5.0, 195.5, 195.5), 1);
finally
Canvas.EndScene;
end;
end;

产生这个结果:

enter image description here enter image description here

放大镜 View 为 500%

编辑2018年2月23日:

另一种值得测试的方法是将表单 Quality 属性更改为HighPerformance

关于delphi - 如何在Firemonkey中绘制虚线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35108036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com