delphi textrect,带角度和文字环绕,垂直对齐

delphi textrect,带角度和文字环绕,垂直对齐,delphi,text,vcl,Delphi,Text,Vcl,我想使用Canvas.TextRect在画布上以90度的角度和文字环绕功能写一些东西。我还希望文本在矩形中垂直对齐。如何做到这一点?以下是创建垂直字体的示例代码: function MakeVerticalFont(f: TFont): TFont; var lf : TLogFont; tf : TFont; begin tf := TFont.Create; tf.Assign( f ); GetObject(tf.Handle, sizeof

我想使用
Canvas.TextRect
在画布上以90度的角度和文字环绕功能写一些东西。我还希望文本在矩形中垂直对齐。如何做到这一点?

以下是创建垂直字体的示例代码:

function MakeVerticalFont(f: TFont): TFont;
var
    lf : TLogFont;
    tf : TFont;
begin
     tf := TFont.Create;

     tf.Assign( f );
     GetObject(tf.Handle, sizeof(lf), @lf);
     lf.lfEscapement := 900; // <--
     lf.lfOrientation := 900; // <-- here we specify a rotation angle
     tf.Handle := CreateFontIndirect(lf);

     result := tf;
end;
[...]

var tf: TFont;
Begin
   ...
   tf := MakeVerticalFont( mycanvas.Font );
   mycanvas.Font.Assign( tf ); // <--- assign the `same` font rotated by 90 degrees
   ...
更新2:我认为最好使用支持文本对齐和换行的

我的Delphi版本没有包含在文档中,但是您可以在上面的链接中看到各种标志。 下面是一个示例代码,以了解如何使用它。我禁用了垂直字体,因为似乎文字换行不适合垂直字体

procedure TForm1.Button1Click(Sender: TObject);
var tf : TFont;
    tmpcanvas : TCanvas;
    rc: TRect;
    s : string;
begin
    tmpcanvas := form1.Canvas;
    tmpcanvas.Font.Name := 'Arial';
    tmpcanvas.Font.Height := 14;

    tf := MakeVerticalFont(tmpcanvas.font);
    //tmpcanvas.Font.Assign(tf); <--- `disabled`

    s := 'Hello world! I''m a long string';
    rc := RECT(10, 10, 50, 200);
    windows.DrawTextEx(
        tmpcanvas.Handle,
        PChar(s),
        length(s),
        rc,
        DT_LEFT or DT_WORDBREAK,
        nil);

    tf.Free;
end;
procedure TForm1.按钮1点击(发送方:TObject);
var-tf:TFont;
tmpcanvas:TCanvas;
rc:TRect;
s:字符串;
开始
tmpcanvas:=form1.Canvas;
tmpcanvas.Font.Name:=“Arial”;
tmpcanvas.Font.Height:=14;
tf:=MakeVerticalFont(tmpcanvas.font);

//tmpcanvas.Font.Assign(tf) 在Delphi 2006及以后的版本中,TFont有一个方向属性。不幸的是,该帮助没有更新到包含它(就像D2006的很多帮助一样)

它是十分之一度,所以设置为90度,使用900

Canvas.Font.Orientation := 900;
Canvas.TextRect(....);
然后还需要根据需要调整矩形坐标


我以前使用过ths,但记不起细节。

它不起作用,我的代码是:tf:=MakeVerticalFont(Canvas.Font);Canvas.Font.Assign(tf);TextOut(10,10,‘hello world’);但它没有任何角度。@rahim asgari,查看我的更新。我不得不使用一个临时的TCanvas对象,在该对象上我指定了垂直字体。如果我直接使用form1.canvas,垂直字体不起作用,你是对的。Thx Nick D,它起作用了,但我不能与textrect一起使用。我需要textrect,因为我希望我的文本被包装。有什么建议吗?@rahim asgari,你不能将它与textrect一起使用是什么意思?它与该函数一起工作。@rahim asgari,文本将在该角和上方绘制。因此,它将位于矩形框之外。尝试
tmpcanvas.TextRect(TR,TR.Left,TR.Top+50,'Hello World')你能画出你的意图的模型图像吗?Canvas.Font没有方向属性。什么版本的Delphi?在Delphi 2006中是这样的(但在Delphi 7中不是这样),如果您使用Delphi 7或更早版本,您将需要使用Nick Dyah提到的方法,您是对的。我使用的是Delphi7,它没有这个属性。
Canvas.Font.Orientation := 900;
Canvas.TextRect(....);