代码之家  ›  专栏  ›  技术社区  ›  gene b.

Delphi TextRect在画布上居中显示文本:TTextFormat

  •  0
  • gene b.  · 技术社区  · 2 年前

    我正努力跟上 this example 关于如何使用 TextRect() 将文本居中放置在画布上,但它似乎已经过时并且不起作用,因为没有 TTextStyle 不再相反 TextRect() 取一个叫 TTextFormat 。

    该线程的原始代码:

    procedure TForm1.Button1Click(Sender: TObject);
    var
      ts: TTextStyle;
    begin
        Canvas.Font.Size:=22;
        Canvas.Font.Color:=clRed;
        ts := Canvas.TextStyle;
        ts.Alignment := taCenter;
        ts.Layout := tlCenter;
        Canvas.TextRect(Rect(100, 100, 300, 300), 0, 0, 'Hello', ts);  // Rect within text is centered, dummy x, dummy y, text, text style
    end;
    

    这个 TextRect documentation 没有提供任何如何使用的示例 TText格式 包括…在内 the FrameRect example 。

    我关注了一些链接 TextFlags 那里没有对齐标志。

    我猜现在它是一个带有标志的数组,但水平和垂直居中对齐的标志是什么?如何更新此示例?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Andreas Rejbrand    2 年前

    首先,在Windows中,不能在按钮的单击处理程序中绘制到画布上。只能在窗口的绘制处理程序中绘制到画布上。

    要尝试此操作,请创建一个新的VCL应用程序并添加 OnPaint 处理程序到主窗体:

    procedure TForm1.FormPaint(Sender: TObject);
    begin
    
      // Fill entire window with white background colour
    
      Canvas.Brush.Color := clWhite;
      Canvas.FillRect(ClientRect);
    
      // Draw text in the middle
    
      Canvas.Font.Color := clBlack;
      Canvas.Font.Size := 32;
    
      var R := ClientRect;
      var S := 'Hello, World!';
    
      Canvas.TextRect(R, S, [tfSingleLine, tfVerticalCenter, tfCenter, tfEndEllipsis]);
    
    end;
    

    首先,我们用白色填充整个窗口。这是我们的背景色。

    然后,我们使用

    Canvas.TextRect(R, S, [tfSingleLine, tfVerticalCenter, tfCenter, tfEndEllipsis]);
    

    这个 tfCenter flag指示函数将文本水平居中。这个 tfVerticalCenter 标志指示它垂直居中,只有当我们也指定 tfSingleLine 旗帜这个 tfEndEllipsis flag是可选的;如果文本不适合矩形,它将使用省略号(…)截断文本。

    (对于奖励积分,添加一行 OnResize 调用的处理程序 Invalidate 以在调整窗口大小时重新绘制整个窗口。)

    Screenshot

    VCL画布' TextRect 函数是使用Win32实现的 DrawText 功能,这是非常好的记录。