我想从文本创建 Direct2D 路径几何。据我了解,我需要创建一个 IDWriteFontFace,我必须从中调用 GetGlyphRunOutline。
不幸的是,我无法弄清楚如何创建该字体。到目前为止,我什至偶然发现了一个字体文件引用,我认为我必须使用它来创建字体。
procedure CreateFontFace;
var
hr: HRESULT;
FontDir: string;
FontPath: string;
ft: _FILETIME;
FontFile: IDWriteFontFile;
FontFace: IDWriteFontFace;
begin
FontDir := GetSpecialFolder(CSIDL_FONTS);
FontPath := IncludeTrailingPathDelimiter(FontDir) + 'Arial.ttf';
// Here, FontPath contains 'C:\Windows\Fonts\Arial.ttf'
// (which exists on my machine)
ft.dwLowDateTime := 0;
ft.dwHighDateTime := 0;
hr := DWriteFactory.CreateFontFileReference(
FontPath, // DOES NOT COMPILE
ft,
FontFile);
if Succeeded(hr) then begin
hr := DWriteFactory.CreateFontFace(
DWRITE_FONT_FACE_TYPE_TRUETYPE,
1,
@FontFile,
0,
DWRITE_FONT_SIMULATIONS_NONE,
FontFace);
end;
end;
Winapi.D2D1中CreateFontFileReference的原型如下:
function CreateFontFileReference(var filePath: WCHAR;
var lastWriteTime: FILETIME;
out fontFile: IDWriteFontFile): HResult; stdcall;
我知道放置字符串而不是 WCHAR 会打扰编译器,但是应该如何编写呢?如果有另一种更简单的方法,我也很感兴趣......
更新: 正如 Remy Lebeau 所说,Winapi.D2D1 单元中还有其他类似的错误声明。我遇到的第二个也是在 CreateFontFileReference 中:参数 lastWriteTime 应该是一个指针,所以为了让我的代码工作,我必须改变我对 ft 变量的使用,如下所示:
var
...
ft: ^_FILETIME;
...
begin
...
ft := nil;
hr := DWriteFactory.CreateFontFileReference(
PChar(FontPath)^,
ft^, // Yes, I am dereferencing nil, and it's working!
FontFile);
...
end;