Delphi - 在rect的中心绘制文本多行

Sim*_*mon 8 delphi text

在Delphi中,我希望在TRect中绘制文本.我希望有以下功能:

  1. 在TRect中垂直居中绘制文本
  2. 在TRect中水平居中绘制文本
  3. 如果有超过1行文本的空间(使用TRect的高度),则绘制文本多行
  4. 如果文本不适合TRect(在单行或多行上),则将省略号附加到文本.

我可以看到Windows.DrawText()函数几乎涵盖了这个功能,但是在写文本时,多行和垂直居中是互斥的.

我想知道这个功能是否内置于Windows(2000+)?如果没有,有没有办法在不编写自己的功能的情况下这样做?

NGL*_*GLN 19

对不起,这是以前所有答案和评论的组合.但似乎OP需要更多的帮助.

function DrawTextCentered(Canvas: TCanvas; const R: TRect; S: String): Integer;
var
  DrawRect: TRect;
  DrawFlags: Cardinal;
  DrawParams: TDrawTextParams;
begin
  DrawRect := R;
  DrawFlags := DT_END_ELLIPSIS or DT_NOPREFIX or DT_WORDBREAK or
    DT_EDITCONTROL or DT_CENTER;
  DrawText(Canvas.Handle, PChar(S), -1, DrawRect, DrawFlags or DT_CALCRECT);
  DrawRect.Right := R.Right;
  if DrawRect.Bottom < R.Bottom then
    OffsetRect(DrawRect, 0, (R.Bottom - DrawRect.Bottom) div 2)
  else
    DrawRect.Bottom := R.Bottom;
  ZeroMemory(@DrawParams, SizeOf(DrawParams));
  DrawParams.cbSize := SizeOf(DrawParams);
  DrawTextEx(Canvas.Handle, PChar(S), -1, DrawRect, DrawFlags, @DrawParams);
  Result := DrawParams.uiLengthDrawn;
end;

procedure TForm1.FormPaint(Sender: TObject);
const
  S = 'This is a very long text as test case for my paint routine.';
var
  R: TRect;
begin
  SetRect(R, 100, 100, 200, 140);
  Canvas.Rectangle(R);
  InflateRect(R, -1, -1);
  Caption := Format('%d characters drawn', [DrawTextCentered(Canvas, R, S)]);
end;
Run Code Online (Sandbox Code Playgroud)

  • +1干得好,谢谢你关闭它 (6认同)
  • 我知道结果是简单的,但任何其他标志组合都没有用!如果可以的话,Woul分裂点数:) (2认同)

Dav*_*nan 5

首先使用测量文本DT_CALCRECT.传递DT_WORDBREAK以指定启用自动换行.这将允许您找到文本所需的高度.然后,您可以在代码中计算垂直偏移,为您提供垂直居中的文本,并绘制到该偏移.

  • @Simon - 我认为您正在寻找`DT_CENTER或DT_WORDBREAK或DT_END_ELLIPSIS或DT_MODIFYSTRING`这将包装您的文本,水平居中并在文本末尾显示省略号,以防最后一行无法完全显示. (2认同)