作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Firemonkey 项目中的 TPaintbox Canvas 上绘制点状网格,结果应该如下所示:
首先,我想先绘制垂直虚线,然后绘制水平虚线,因此考虑到这一点,我尝试先绘制一条线,以使外观恰到好处,这就是我尝试过的:
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
形状可以按照我想要的方式绘制虚线:
但是我需要自己在 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;
产生这个结果:
放大镜 View 为 500%
编辑2018年2月23日:
另一种值得测试的方法是将表单 Quality
属性更改为HighPerformance
关于delphi - 如何在Firemonkey中绘制虚线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35108036/
我是一名优秀的程序员,十分优秀!