gpt4 book ai didi

delphi - 如何创建 IDWriteFontFile

转载 作者:行者123 更新时间:2023-12-03 15:54:48 30 4
gpt4 key购买 nike

我想从文本创建 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的原型(prototype)如下:

    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;

最佳答案

如果您使用的是 Delphi 2009 或更高版本,其中 String 是 Unicode,则在将 String 传递给CreateFontFileReference():

hr := DWriteFactory.CreateFontFileReference( 
PChar(FontPath),
ft,
FontFile);

如果您使用的是 Delphi 2007 或更早版本,其中 String 为 Ansi,则需要先将 String 转换为 WideString,然后再将 String 转换为 WideString将其类型转换为 PWideChar:

hr := DWriteFactory.CreateFontFileReference( 
PWideChar(WideString(FontPath)),
ft,
FontFile);

更新:事实证明,CreateFontFileReference() 第一个参数的声明存在错误。 Embarcadero 将其声明为 var filePath: WCHAR,但它应该声明为 const filePath: PWCHAR。因此,您必须通过取消引用 PChar/PWideChar 指针来解决该错误,例如:

hr := DWriteFactory.CreateFontFileReference( 
PChar(FontPath)^,
...);

hr := DWriteFactory.CreateFontFileReference( 
PWideChar(WideString(FontPath))^,
...);

关于delphi - 如何创建 IDWriteFontFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17338753/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com