TDirect2DCanvas中的字体方向不起作用?

时间:2019-06-06 13:09:19

标签: delphi orientation direct2d

我需要在TDirect2DCanvas上绘制倾斜的文本,但没有成功。

procedure TForm1.FormPaint(Sender: TObject);
var
  LCanvas: TDirect2DCanvas;
const
  myText = 'Kikimor';
begin
   LCanvas := TDirect2DCanvas.Create(Canvas, ClientRect);
   LCanvas.BeginDraw;
   try
     LCanvas.Font.Orientation := 90;
     LCanvas.TextOut(100,100,myText);
   finally
     LCanvas.EndDraw;
     LCanvas.Free;
   end;
end;

无论我定向的角度如何,它总是绘制直线文本。 定向不起作用还是我需要做其他事情?

2 个答案:

答案 0 :(得分:1)

设置TDirect2DCanvas.Font.Orientation没有任何效果(很可能没有实现,抱歉,没有时间进行调试)。 Delphi提供的Direct2D包装器非常基础。

要实现您的目标,请手动进行转换:

procedure TForm1.FormPaint(Sender: TObject);
var
  LCanvas: TDirect2DCanvas;
  currentTransform: TD2D1Matrix3x2F;
  ptf: TD2DPoint2f;
const
  myText = 'Kikimor';
begin
  LCanvas := TDirect2DCanvas.Create(self.Canvas, ClientRect);
  LCanvas.BeginDraw;
  try
//    backup the current transformation
    LCanvas.RenderTarget.GetTransform(currentTransform);
    ptf.x:= 100.0; ptf.y:= 100.0;  //rotation center point
// apply transformation to rotate text at 90 degrees:
    LCanvas.RenderTarget.SetTransform(TD2D1Matrix3x2F.Rotation(90, ptf));
// draw the text (rotated)
    LCanvas.TextOut(100, 100, myText);
// restore the original transform
    LCanvas.RenderTarget.SetTransform(currentTransform);
  finally
    LCanvas.EndDraw;
    LCanvas.Free;
  end;
end;

有关更多信息/效果,请查看: Drawing text using the IDWriteTextLayout.Draw() 同一网站上的整个Direct2D类别也很有趣(使用Google翻译)。

答案 1 :(得分:1)

对于那些使用C ++ Builder的人,我可以使用它:

#include <Vcl.Direct2D.hpp>

// needed for the D2D1::Matrix3x2F::Rotation transform
#ifdef _WIN64
#pragma comment(lib,"D2D1.a")
#else
#pragma comment(lib,"D2D1.lib")
#endif

TD2DPoint2f point; // rotation centre
point.x = 100.0;
point.y = 100.0;

canvas_2d->RenderTarget->SetTransform(D2D1::Matrix3x2F::Rotation(90, point));
canvas_2d->TextOut(100, 100, text);

// restore 0 rotation afterwards
canvas_2d->RenderTarget->SetTransform(D2D1::Matrix3x2F::Rotation(0, point));

请注意,尝试像在Delphi版本中那样使用GetTransform会导致异常,因此我通过向其传递一个零旋转的新变量来清除了该转换,也许有更好的方法来实现。

由于链接错误,需要使用编译指示,有关详细信息,请参见this answer