2012-04-23 24 views
0

我想全部替換「#」替換爲新線畫出:Delphi7的Canvas.TextOut不能寫入新線

Canvas.TextOut(0,0,''+StringReplace('a#b','#',#13#10,[rfReplaceAll])); 

,但沒有。
的TextOut打印 「A·B」 之類的將被替換部分甚至不存在(但它確實存在ofcourse):ab
取而代之的是:

a 
b 

#13#10是新線(Windows)中右?
那爲什麼這不起作用?

謝謝。

+3

據我所知,'TextOut'不能處理多行。嘗試在'DT_WORDBREAK'中使用'DrawText'或'DrawTextEx'。看看這裏:http://stackoverflow.com/questions/1648277/delphi-textrect-wordwrap – 2012-04-23 08:51:57

+0

另一個這裏:http://stackoverflow.com/questions/7719025/delphi-drawing-text-to-canvas-word-wrap -and-measuring-size – pritaeas 2012-04-23 08:54:12

回答

7

您需要使用DrawText產生多行文字:

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

你很可能要在最後一個參數使用不同的標誌,但我敢肯定,你可以閱讀documentation,並制定你需要什麼。

2

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。

+3

由於'DrawText'在非Unicode Delphi中映射到'DrawTextA',並且在Delphi的Unicode版本中映射到'DrawTextW',所以您可以使用'PChar'而不是'PWideChar'。 'PChar'是Unicode版本中的'PWideChar'和非Unicode中的'PAnsiChar'。 – TLama 2012-04-23 09:08:30