【问题标题】:Delphi FireMonkey app can not draw simple black rectangleDelphi FireMonkey 应用程序无法绘制简单的黑色矩形
【发布时间】:2013-08-20 13:02:36
【问题描述】:

只需创建简单的 FireMokey HD 应用,将带有 align=alclient 的 TImage 放在表单上并尝试绘制简单的黑色矩形:

procedure TForm8.FormCreate(Sender: TObject);
var
  c: TCanvas;
begin
  Image.Bitmap := TBitmap.Create(ClientWidth, ClientHeight);
  c := Image.Bitmap.Canvas;
  c.BeginScene;
  try
    c.Clear(claWhite);
    c.Stroke.Color := claBlack;
    c.Stroke.Kind := TBrushKind.bkSolid;
    c.DrawRect(
      TRectF.Create(7,7,ClientWidth-7,ClientHeight-7),
      0,0,
      [],
      1
    );
  finally
    c.EndScene;
  end;
end;

而且它不起作用。矩形的颜色不是黑色,它是一种灰色。角落的颜色有一些变化。我需要设置一些其他属性还是这里有什么问题? 我尝试了不同的不透明度值(1,100,255,65535),图片根本没有改变,帮助中没有任何信息,这个选项到底意味着什么。 放大的左上角:

还尝试使用示例中描述的多边形。同样的问题-圆角和灰色而不是黑色(图像的不透明度属性为1,默认情况下所有属性):

procedure TForm8.Button2Click(Sender: TObject);
var
  p1, p2, p3, p4, p5: TPointF;
  MyPolygon: TPolygon;
begin
  // sets the points that define the polygon
  p1.Create(100, 100);
  p2.Create(200, 100);
  p3.Create(200, 200);
  p4.Create(100, 200);
  p5.Create(100, 100);
  // creates the polygon
  SetLength(MyPolygon, 5);
  MyPolygon[0] := p1;
  MyPolygon[1] := p2;
  MyPolygon[2] := p3;
  MyPolygon[3] := p4;
  MyPolygon[4] := p5;
  Image.Bitmap.Canvas.BeginScene;
  // draws the polygon on the canvas
  Image.Bitmap.Canvas.DrawPolygon(MyPolygon, 50);
  Image.Bitmap.Canvas.EndScene;
  // updates the bitmap
//  Image.Bitmap.BitmapChanged;
 end;

【问题讨论】:

  • 能否添加一个带有Delphi版本的标签,请问您是在哪里遇到这个问题的?顺便提一句。您是否尝试过关注,例如this example ?我不知道 FMX,但这不是 BeginSceneEndScene 重要吗? 【自毁评论;请不要回复]
  • @TLama:您链接中的那些示例已经过时。方法 BitmapChanged 不再可用,它现在处于受保护的部分(这是个好消息,因为同时使用 EndScene 和其他东西很奇怪)。 BeginScene 和 EndScene 在这种情况下没有帮助。这是基本功能,很难在 FM 中找到应有的功能......
  • 我不知道你为什么说BeginSceneEndScene 没有帮助,但至少你应该调用这个函数对(并且你在你的代码中错过了它现在)。请参阅BeginScene 参考。在 TCanvas 上绘图之前,有明确的说明,Call BeginScene。要结束绘图会话,请调用 EndScene。
  • @TLama:我说它没有帮助,因为我试过了。我尝试使用不同的参数并没有看到任何结果。刚刚更新的代码示例,现在它有 Begin-End 场景,问题仍然存在。
  • 尝试将 0.5 添加到所有坐标。我相信 FMX 在像素边界上绘制,因此绘制两条像素宽的灰线,而不是单像素宽的黑线。

标签: delphi canvas opacity firemonkey delphi-xe3


【解决方案1】:

http://roman.yankovsky.me/?p=1018

if Canvas.BeginScene then
try
  Canvas.Stroke.Thickness := 1.5;
  Canvas.Stroke.Kind := TBrushKind.bkSolid;
  Canvas.Fill.Color := TAlphaColorRec.Black;
  Canvas.Fill.Kind := TBrushKind.bkSolid;

  for I := 1 to 9 do
  begin
    Canvas.DrawLine(PointF(50 + I * 25 - (Canvas.Stroke.Thickness / 2), 0),
      PointF(50 + I * 25 - (Canvas.Stroke.Thickness / 2), ClientHeight), 1);
  end;
finally
  Canvas.EndScene;
end;

【讨论】:

    【解决方案2】:

    一旦您了解了更好的 Firemonkey 范例,这很容易解决。 Firemonkey 使用实坐标,而不是整数坐标。你无意中告诉它画线以像素之间的边界为中心,所以你的每条线一半在一组像素中,另一半在另一组像素中。

    具体来说,您的整数坐标被解释为连续数轴上的精确中心点。例如,假设点是 7。以点 7.0 为中心的宽度为 1 的线将在数轴上从 6.5 延伸到 7.5。但是因为像素在数轴上从 6.0 延伸到 6.99,从 7.0 延伸到 7.99,所以每个像素都是半黑半白。自动抗锯齿使它们被绘制成 50% 的黑色,这就是两像素宽的灰色的来源。

    使用 FMX(现在称为 FMX)时,您必须将思维从整数坐标转换为实坐标,这要复杂得多且功能强大。

    最简单的解决方案是将基于整数的数学向右移动 0.5 并向下移动 0.5。然后 7.5 处的一像素宽的线将从 7.0 延伸到 7.999,这正是您所期望的。为此,只需在您发出绘图命令时将所有像素坐标(水平和垂直)添加 0.5。

    好消息是,0.8 像素宽或 1.5 像素宽的线条会分别自动显得更细或更粗。对角线和其他曲线看起来正确,没有锯齿状边缘。您可以缩放复杂的图纸,并且它们在任何缩放级别都看起来很完美。 (半像素偏移的数学对于所有缩放级别都保持不变。0.5 是在缩放之后在绘制线条之前添加的。)

    以上内容适用于所有设备:屏幕、位图和打印机等。因此,在屏幕上绘制的相同代码可用于绘制其他所有设备。绘制文本时,您可以对字体使用小数点大小,以便它们随其他所有内容缩放。

    【讨论】:

      猜你喜欢
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多