文本渲染器:如何测量文本在不同Dpi的机器上的大小?

7

我有一个由服务器和客户端组成的C# WinForms应用程序。我使用TextRenderer.MeasureText(string text, Font font)方法来测量文本。

在某些时候,我需要在服务器端测量文本,就像在客户端一样。我将Graphics.DpiX和Graphics.DpiY值从客户端发送到服务器。基于这些值,我如何在服务器端测量文本?关键点在于客户端和服务器端的Dpi可能不同。

我猜想,我可以从Dpi值中创建Graphics对象,并使用TextRenderer.MeasureText(IDeviceContext dc, string text, Font font)重载来测量我的文本。但是如何仅从DpiX和DpiY值创建Graphics呢?


3
使用Graphics.FromImage()创建图形对象,使用一个虚拟位图调用SetResolution()。 - Hans Passant
2
@Hans,如果我使用这种方式,Graphics 对象的 MeasureString(string text, Font font) 方法返回正确的值,但是 TextRenderer 似乎没有考虑到 Graphics.DpiXGraphics.DpiY 的值。你有什么想法,为什么会发生这种情况?我不想使用 Graphics.MeasureString(string text, Font font) 方法,因为我知道它可能不准确。 - Artem Kachanovskyi
@Hans,使用Graphics.MeasureString(string text, Font font)怎么样?这个方法不好吗? - Artem Kachanovskyi
2
它确实关注DPI,但其他代码使用Graphics.DrawString()非常重要。它很少这样做,GDI+文本渲染相当有问题。 - Hans Passant
只是猜测,你尝试过 TextFormatFlags.PreserveGraphicsTranslateTransform 吗? - Robert S.
显示剩余2条评论
1个回答

0
你可以尝试这个技巧:将变换应用于你正在使用的字体大小进行测量:在120dpi上使用12pt字体绘图将需要与在96dpi上使用12*120/96=15的字体大小相同的像素数量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接