Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi FireMonkey-在Windows中绘制不带抗锯齿的1像素线_Delphi_Line_Firemonkey - Fatal编程技术网

Delphi FireMonkey-在Windows中绘制不带抗锯齿的1像素线

Delphi FireMonkey-在Windows中绘制不带抗锯齿的1像素线,delphi,line,firemonkey,Delphi,Line,Firemonkey,我试图画一条1像素的线,但没有成功。我尝试将表单中的Qualityparam设置为所有三个可用选项,但这并不会改变结果:始终获得一行抗锯齿。相反地,tRectangle类以某种方式绘制了一个干净的1像素宽的边框,这意味着可以禁用抗锯齿模式。问题是怎么做。下面是我正在使用的代码示例: procedure tMyLine.Paint; begin with Canvas do begin Stroke.Cap := Flat; Stroke.Color

我试图画一条1像素的线,但没有成功。我尝试将表单中的
Quality
param设置为所有三个可用选项,但这并不会改变结果:始终获得一行抗锯齿。相反地,
tRectangle
类以某种方式绘制了一个干净的1像素宽的边框,这意味着可以禁用抗锯齿模式。问题是怎么做。下面是我正在使用的代码示例:

procedure tMyLine.Paint;
begin
  with Canvas do begin
       Stroke.Cap       := Flat;
       Stroke.Color     := tAlphaColor.Blue;
       Stroke.Join      := Miter;
       Stroke.Kind      := Solid;
       Stroke.Thickness := 1;
       BeginScene;
         DrawLine (tPointF (10, 10), tPointF (100, 10), 1);
       EndScene;
  end;
end; 
厚度小于1也不起作用。

使用表单和颜料盒的这些设置(偏离默认值): (顺便说一句,使用Delphi10.1柏林版,我没有安装东京版)

注意:
Quality=HighPerformance
,而不是
HighQuality

下面的代码

procedure TForm24.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
  a: integer;
begin
  Canvas.BeginScene;
  try
    Canvas.Stroke.Color := TAlphaColorRec.Black;
    Canvas.Stroke.Kind := TBrushKind.Solid;
    Canvas.Stroke.Dash := TStrokeDash.solid;

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

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


    Canvas.DrawLine(PointF(0, 0), PointF(200, 200), 1);
    Canvas.DrawEllipse(RectF(5, 5, 195, 195), 1);

    Canvas.Stroke.Dash := TStrokeDash.Solid;
    Canvas.Stroke.Color := TAlphaColorRec.Red;
    Canvas.DrawRect(RectF(5, 5, 195, 195), 0, 0, [], 1);
  finally
    Canvas.EndScene;
  end;
end;
产生这个结果


通过将坐标设置为整数+0.5,我可以对垂直线和水平线执行此操作。如果你使用整数坐标,那么你把线放在一个像素边界上,但是通过添加0.5,你把线放在像素的中间。
抽绳(t点f(10.5,10.5),t点f(100.5,10.5,1)

@Tom Brunberg。谢谢你的评论。您的代码适用于虚线,但对于具有对角线坡度的实线,结果是一条抗锯齿线。@Tom Brunberg。我道歉。事实上,
tRectangle
在旋转任何角度(不是90的倍数)时渲染抗锯齿线。我简直不明白为什么要抑制反别名如此困难。你真的尝试过表单上的
Quality=HighPerformance
?@Tom Brunberg。对正如我在问题的标题中所说:“我尝试将表单中的Quality param设置为所有三个可用选项,但这不会改变结果”。好的,用户,然后我需要询问您使用的是哪个版本,因为在XE7中,它会产生不同。
procedure TForm24.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
var
  a: integer;
begin
  Canvas.BeginScene;
  try
    Canvas.Stroke.Color := TAlphaColorRec.Black;
    Canvas.Stroke.Kind := TBrushKind.Solid;
    Canvas.Stroke.Dash := TStrokeDash.solid;

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

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


    Canvas.DrawLine(PointF(0, 0), PointF(200, 200), 1);
    Canvas.DrawEllipse(RectF(5, 5, 195, 195), 1);

    Canvas.Stroke.Dash := TStrokeDash.Solid;
    Canvas.Stroke.Color := TAlphaColorRec.Red;
    Canvas.DrawRect(RectF(5, 5, 195, 195), 0, 0, [], 1);
  finally
    Canvas.EndScene;
  end;
end;