TDirect2DCanvas 中的字体方向不起作用?
Font orientation in TDirect2DCanvas is not working?
我需要在 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;
无论我以什么角度定位,它总是绘制一条笔直的文字。
是方向不工作还是我需要做其他事情?
设置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;
更广泛的 information/effects 你可以看看:
Drawing text using the IDWriteTextLayout.Draw()
同一站点的整个 Direct2D 类别也很有趣(使用 Google 翻译)。
对于那些使用 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 会导致异常,因此我通过向它传递一个零旋转的新变换来清除变换,可能有更好的方法来执行此操作。
由于 link 错误,需要 pragma,详情请参阅 this answer。
我需要在 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;
无论我以什么角度定位,它总是绘制一条笔直的文字。 是方向不工作还是我需要做其他事情?
设置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;
更广泛的 information/effects 你可以看看: Drawing text using the IDWriteTextLayout.Draw() 同一站点的整个 Direct2D 类别也很有趣(使用 Google 翻译)。
对于那些使用 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 会导致异常,因此我通过向它传递一个零旋转的新变换来清除变换,可能有更好的方法来执行此操作。
由于 link 错误,需要 pragma,详情请参阅 this answer。