Delphi7 Canvas.TextOut无法写入新行

Delphi7 Canvas.TextOut无法写入新行,delphi,delphi-7,newline,Delphi,Delphi 7,Newline,我试图用新的线条来代替所有的线条: Canvas.TextOut(0,0,''+StringReplace('a#b','#',#13#10,[rfReplaceAll])); 但什么都没有。 TextOut打印ab,就像被替换的部件甚至不存在一样,但它确实存在:ab 与此相反: a b 1310新线对吗? 那为什么这不起作用呢 谢谢。您需要使用DrawText生成多行文本: var R: TRect; .... R := Rect(0, 0, Width, Height); DrawT

我试图用新的线条来代替所有的线条:

Canvas.TextOut(0,0,''+StringReplace('a#b','#',#13#10,[rfReplaceAll]));
但什么都没有。 TextOut打印ab,就像被替换的部件甚至不存在一样,但它确实存在:ab 与此相反:

a
b
1310新线对吗? 那为什么这不起作用呢

谢谢。

您需要使用DrawText生成多行文本:

var
  R: TRect;
....
R := Rect(0, 0, Width, Height);
DrawText(
  Canvas.Handle,
  PChar(StringReplace('a#b','#',#13#10,[rfReplaceAll])),
  -1,
  R,
  0
);

您可能非常希望在最后一个参数中使用不同的标志,但我相信您可以阅读并计算出所需的内容。

Textout基本上是Windows.ExtTextOut的包装,它不支持多行。另一种方法是使用DrawText:

var
  r: TRect
  s: string
begin
  s := StringReplace('a#b','#',#13#10,[rfReplaceAll]);
  r.Left := 10;
  r.Top := 10;
  DrawText(Canvas.Handle, PWideChar(s), Length(s), r, DT_NOPREFIX or DT_WORDBREAK);
end;
如果您使用的是Delphi 7,那么您可能希望用PChar替换PWideChar。

据我所知,TextOut无法处理多行。尝试将DrawText或DrawTextEx与DT_WORDBREAK一起使用。看这里:这里还有一个:您可以使用PChar而不是PWideChar,因为DrawText在非Unicode Delphi中映射到DrawTextA,在Delphi的Unicode版本中映射到DrawTextW。PChar在Unicode版本中是PWideChar,在非Unicode版本中是PAnsiChar。