C# 获取SharpDX/DirectWrite中的ABC字符宽度

C# 获取SharpDX/DirectWrite中的ABC字符宽度,c#,sharpdx,directwrite,C#,Sharpdx,Directwrite,在GDI中,获取我将调用的角色的ABC宽度(左方向角、右方向角等) 我如何使用SharpDX或DirectWrite实现相同的测量,我是否应该期望相同字符的值与GDI之间匹配 到目前为止我做了什么?在缺少Direct*和SharpDX文档的情况下迷失方向。,也许吧?我对DirectWrite不太熟悉,但即使在GDI中,我也很少需要GetCharABCWidths。通常,您真正需要知道的是特定字符串的尺寸(即使该字符串仅由一个字符组成),因此您只需使用DT_CALCRECT调用DrawString

在GDI中,获取我将调用的角色的ABC宽度(左方向角、右方向角等)

我如何使用SharpDX或DirectWrite实现相同的测量,我是否应该期望相同字符的值与GDI之间匹配


到目前为止我做了什么?在缺少Direct*和SharpDX文档的情况下迷失方向。

,也许吧?我对DirectWrite不太熟悉,但即使在GDI中,我也很少需要
GetCharABCWidths
。通常,您真正需要知道的是特定字符串的尺寸(即使该字符串仅由一个字符组成),因此您只需使用
DT_CALCRECT
调用
DrawString
,或者其他任何方法。我确信DirectWrite有一个类似的“MeasureText”函数。是的@CodyGray,你会认为这是GDI之后的一次轻松体验。GetDesignGlyphMetrics返回一个结构,该结构
以字体设计单位获得理想的(独立于分辨率的)字形度量
与良好的ole GDI不太一样。事实上,我需要a&B宽度以满足某些精确对齐的需要。不,我真的不需要。就我而言,GDI是一次轻松愉快的旅行。这也是我能在我的机器上得到的最清晰的文本渲染,也是最快的。就我而言,从那以后的一切都是倒退,至少对于文本输出和其他非图形密集型绘图任务来说是如此。我开始意识到这一点。我的应用程序将作为一项服务运行,它将引导我使用DirectWrite和WARP。我必须继续前进。出于兴趣,我是否应该期望ABC宽度在GDI和DirectWrite?之间匹配?我对DirectWrite不太熟悉,但即使在GDI中,我也很少需要
GetCharABCWidths
。通常,您真正需要知道的是特定字符串的尺寸(即使该字符串仅由一个字符组成),因此您只需使用
DT_CALCRECT
调用
DrawString
,或者其他任何方法。我确信DirectWrite有一个类似的“MeasureText”函数。是的@CodyGray,你会认为这是GDI之后的一次轻松体验。GetDesignGlyphMetrics返回一个结构,该结构
以字体设计单位获得理想的(独立于分辨率的)字形度量
与良好的ole GDI不太一样。事实上,我需要a&B宽度以满足某些精确对齐的需要。不,我真的不需要。就我而言,GDI是一次轻松愉快的旅行。这也是我能在我的机器上得到的最清晰的文本渲染,也是最快的。就我而言,从那以后的一切都是倒退,至少对于文本输出和其他非图形密集型绘图任务来说是如此。我开始意识到这一点。我的应用程序将作为一项服务运行,它将引导我使用DirectWrite和WARP。我必须继续前进。出于兴趣,我应该期望ABC宽度在GDI和DirectWrite之间匹配吗?谢谢Dan-我真的很感谢您的输入,但如何从中获取字符ABC宽度并不明显,您能解释一下吗?当然。更新。您必须将“textFormat”设置为适当的值。好的,谢谢-到目前为止,我的理解是,这会在第二个参数中给出字符串的宽度,当在指定的字体特征等中列出时,我使用术语“ABC”是为了解释我在OP-函数中寻找与旧GDI GetCharABCWidths()-链接相同的功能,我认为它不同于TextLayout()函数,因为GDI fn提供左中和右方位(在GDI中也称为“ABC”宽度)。我可能完全错了,但我认为TextLayout()给出了完整字符串的大小,但不是每个字符的度量值?啊。正确。我不确定您需要多少度量值。如果只是字符宽度,也许您可以尝试类似于:var widths=“ABC”。Select(=>newTextLayout(dwFactory,u.ToString()),textFormat,float.PositiveInfinity,float.PositiveInfinity)).ToList();我的想法是一样的,但我目前发现TextLayout()中的悬垂指标在我们当前的开发中,似乎在所有情况下都是零。我有人对此进行了调查,但想检查SO社区是否知道一种更合适的方法。此外,我还有很多需要衡量的地方,我担心TextLayout()的重复使用这将是一项开销。一般来说,我希望DirectWrite提供与GDI同等或更好的功能,我只是玩得很开心(!)试图在没有地图的情况下找到我的路线。谢谢Dan-我真的很感谢你的输入,但如何从中获取字符ABC宽度并不明显,你能解释一下吗?当然。更新。你必须设置“textFormat”到适当的值。好的,谢谢-到目前为止,我的理解是,当在指定的字体特征等中进行布局时,这会在第二个参数中给出字符串的宽度。我使用术语“ABC”是为了解释我正在寻找与旧GDI GetCharABCWidths()相同的功能-我的OP-函数中的link,我认为它与TextLayout()函数的不同之处在于GDI fn提供了左中和右方向角(在GDI中也称为“ABC”宽度)。我可能完全错了,但我认为TextLayout()是给出完整字符串的大小,但不是每个字符的度量值?啊。正确。我不确定您需要多少度量值。如果只是字符宽度,也许您可以尝试类似的方法:var widths=“ABC”。选择(=>new TextLayout(dwFactory,u.ToString(),textFormat,float.PositiveInfinity,float.PositiveInfinity))。ToList();我也这么认为,但我发现目前TextLayout()中的悬垂指标在我们当前的开发中,似乎在所有情况下都是零。我有人对此进行了调查,但想检查SO社区是否知道一种更合适的方法。此外,我还有很多需要衡量的地方,我担心TextLayout()的重复使用一般来说,我希望DirectWrite提供与GDI同等或更好的功能,我只是在寻找我的w
/// <summary>
///  Takes a string, text format, and associated constraints, and produces an object that represents the fully analyzed and formatted result.
/// </summary>
/// <param name="factory">an instance of <see cref="T:SharpDX.DirectWrite.Factory" /></param>
/// <param name="text">An array of characters that contains the string to create a new <see cref="T:SharpDX.DirectWrite.TextLayout" /> object from. This array must be of length stringLength and can contain embedded NULL characters.</param>
/// <param name="textFormat">A pointer to an object that indicates the format to apply to the string.</param>
/// <param name="maxWidth">The width of the layout box.</param>
/// <param name="maxHeight">The height of the layout box.</param>
/// <unmanaged>HRESULT CreateTextLayout([In, Buffer] const wchar* string,[None] UINT32 stringLength,[None] IDWriteTextFormat* textFormat,[None] FLOAT maxWidth,[None] FLOAT maxHeight,[Out] IDWriteTextLayout** textLayout)</unmanaged>
public TextLayout(Factory factory, string text, TextFormat textFormat, float maxWidth, float maxHeight)
using (var dwFactory = new SharpDX.DirectWrite.Factory())
{
  var textLayout = new TextLayout(dwFactory, "ABC", textFormat, float.PositiveInfinity, float.PositiveInfinity);
  var width = textLayout.Metrics.Width
  ...
}