【问题标题】:How do i get the size of a font in pixels?我如何获得以像素为单位的字体大小?
【发布时间】:2012-01-17 14:28:43
【问题描述】:

我最初的直觉是通过 Graphics 实例获取系统的当前 DpiY 设置,但我不知道如何获取。

通过反射器拼写我看到微软使用不安全的代码来管理它:

IntPtr dC = UnsafeNativeMethods.GetDC(NativeMethods.NullHandleRef);
try
{
    using (Graphics graphics = Graphics.FromHdcInternal(dC))
    {
        float num = graphics.DpiY;
    }
}

当我没有图形时,构造图形的托管等效方法是什么?

我试过了:

using (Graphics g = Graphics.FromHdc(IntPtr.Zero))
{
    return font.GetHeight(g.DpiY);
}

但这会引发 Value cannot be null 异常。

【问题讨论】:

  • 通常,当我完成我的问题并弄清楚我的真正的问题是什么时,我会更改我的标题。请检查我的编辑以确保我没有回答您的问题。
  • @Will 这是我最初问题的重点。我对字体大小(例如控件大小、图像大小、缩放量)并不总是感兴趣。我担心有人可能会短路问题,并尝试使用MeasureText 来获取字体高度。人们倾向于将问题与适用性混淆。我试过省略理由,只问我的问题。但是人们在不知道为什么我想做某事的情况下拒绝回答。我有完整的为什么示例,然后你让 John Saunders 投反对票,因为他脾气暴躁 (stackoverflow.com/q/8141795/12597)
  • @Will 这是另一个很好的问题示例。一个人问了我 LINQ where or filter c# (stackoverflow.com/questions/5954965/…) 的确切问题。答案欺骗了问题,而是回答了例子。今天我有完全相同的问题,但现有的答案不能回答这个问题。我必须构建完全相同的问题(重新排列标题中的单词以使其看起来完全不同 LINQ filter where or (stackoverflow.com/questions/8900131/linq-filter-where-or)。

标签: .net graphics gdi+


【解决方案1】:

您可以尝试使用不使用Graphics 对象的TextRendering 方法:

int textHeight = TextRenderer.MeasureText("Text", this.Font).Height;

或者,如果需要,您可以自己制作快速Graphic

float textHeight;
using (Bitmap b = new Bitmap(1,1))
using (Graphics g = Graphics.FromImage(b)) {
  textHeight = this.Font.GetHeight(g.DpiY);
}

【讨论】:

  • 我担心在当前系统 dpi 设置下不能保证创建位图的分辨率(即许多绘图系统以 72 dpi 创建图形)。但它似乎与Bitmap 创建时的系统分辨率相匹配。
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 2011-08-17
  • 2013-04-26
  • 2018-07-04
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多