gpt4 book ai didi

c++ - 正确测量像素中的字符

转载 作者:行者123 更新时间:2023-11-30 00:39:04 25 4
gpt4 key购买 nike

我正在从头开始编写一个文本框,以便针对语法突出显示对其进行优化。但是,我需要准确地获取以像素为单位的字符宽度,而不是 Graphics::MeasureString 给我的垃圾。我在网上找到了很多东西,特别是 this ,但是,它们似乎都不起作用,或者不考虑制表符。我需要最快的方法来测量字符的精确尺寸(以像素和制表符空间为单位)。我似乎无法弄清楚这一点...

应该提到我正在使用 C++、CLR/CLI 和 GDI+


这是我的测量函数。在另一个函数中,它返回的 RectangleF 被绘制到屏幕上:

RectangleF TextEditor::MeasureStringWidth(String^ ch, Graphics^ g, int xDistance, int lineYval)
{
RectangleF measured;
Font^ currentFont = gcnew Font(m_font, (float)m_fontSize);
StringFormat^ stringFormat = gcnew StringFormat;
RectangleF layout = RectangleF(xDistance,lineYval,35,m_fontHeightPix);
array<CharacterRange>^ charRanges = {CharacterRange(0,1)};
array<Region^>^ strRegions;

stringFormat->FormatFlags = StringFormatFlags::DirectionVertical;
stringFormat->SetMeasurableCharacterRanges(charRanges);

strRegions = g->MeasureCharacterRanges(ch, currentFont, layout, stringFormat);

if(strRegions->Length >= 1)
measured = strRegions[0]->GetBounds(g);
else
measured = RectangleF(0,0,0,0);

return measured;
}

我不太明白 MeasureCharacterRanges layoutRect 参数的作用。我修改了 Microsoft 示例中的代码,使其仅适用于或仅测量一个字符。

最佳答案

您不应该将 Graphics 用于任何文本渲染。

从 .NET Framework 2.0 开始,对 Graphics.MeasureStringGraphics.DrawString 的使用已被弃用,取而代之的是新添加的帮助程序类 TextRenderer :

  • TextRenderer.MeasureText
  • TextRenderer.DrawText

GDI+ 文本渲染器已被废弃,10 多年来没有得到任何改进或修复;以及软件渲染。

GDI 渲染(TextRenderer 是其简单包装器)是硬件加速的,并且继续获得渲染改进(连字、Uniscribe 等)。

注意: GDI+ 文本渲染由 Graphics.DrawStringMeasureString 包裹

下面是GraphicsTextRenderer的测量结果比较:

enter image description here

GDI+ 测量不是“错误”,它们完全按照它们的意图进行 - 返回文本如果呈现为原始文本的大小字体作者的意图(您可以使用抗锯齿渲染实现):

enter image description here

但没有人真的想要按照字体设计者的预期方式查看文本,因为这会导致内容无法在像素边界上排列 - 使文本过于模糊(即,如您在苹果)。理想情况下,文本应对齐到实际像素边界(即 Windows 的Grid Fitting)

红利阅读

关于c++ - 正确测量像素中的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9373044/

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