C# 如何在Windows窗体中创建具有精确字符高度的字体?

C# 如何在Windows窗体中创建具有精确字符高度的字体?,c#,winforms,fonts,font-size,C#,Winforms,Fonts,Font Size,在我的程序中,我需要生成一个位图,其中包含从左到右排列的所有数字字符(0..9),以及一些其他字符 用户将从UI中选择: 所需字体,以及 所需的字符高度(以像素为单位) 所以我想创建一个位图,然后从这个位图中创建一个图形,然后把数字一个接一个地画到这个位图中,然后把它保存到磁盘上 几个小时内我想不出来的是: 如何创建具有正确大小的字体,以便数字“0”具有用户给定的高度 我使用字体构造函数中的所有参数,使用StringFormat属性,使用MeasureString/MeasureText/Mea

在我的程序中,我需要生成一个位图,其中包含从左到右排列的所有数字字符(0..9),以及一些其他字符

用户将从UI中选择:

  • 所需字体,以及
  • 所需的字符高度(以像素为单位)
  • 所以我想创建一个位图,然后从这个位图中创建一个图形,然后把数字一个接一个地画到这个位图中,然后把它保存到磁盘上

    几个小时内我想不出来的是: 如何创建具有正确大小的字体,以便数字“0”具有用户给定的高度

    我使用字体构造函数中的所有参数,使用StringFormat属性,使用MeasureString/MeasureText/MeasureCharacterRanges,我尝试通过p/Invoke(使用正/负nHeight)使用本机CreateFont()创建字体。所有称为“size”或“height”的参数似乎都表示某个假设字符的大小,该字符比“0”大得多

    我确实读过关于线条高度、em高度、上升、下降等的理论。没有填充和间距等,似乎没有关于角色真实高度的概念

    我的问题是:给定字体名称和“0”字形所需的像素高度,如何创建一种字体来绘制具有所需高度的字形

    我希望得到任何指导

    后期编辑
    关于我的项目的更多细节:这是一个带有大屏幕的嵌入式设备,我需要为设计师提供一种简单的方法来生成和试用他们喜欢的位图字体。生成这种位图字体的Windows工具对我来说似乎是一个很好的解决方案。

    我相信您可以使用它来指定要使用的像素。然后它应该创建具有适当大小的字体

    添加测试代码-根据您的情况进行相应的编辑,不要对样式进行判断,我只是想要一些可以粘贴到LINQPad中并生成图像的内容

    using (var font = new Font("Arial",10,FontStyle.Regular, GraphicsUnit.Pixel))
    using (var image = new Bitmap(30, 15))
    using (var graphics = Graphics.FromImage(image))
    {
        graphics.FillRectangle(Brushes.White, new Rectangle(0, 0, 30, 15));
        graphics.DrawString("Ay", font, Brushes.Black, 0, 0);
        image.Save(@"E:\test.bmp", ImageFormat.Bmp);
    }
    

    请记住,当按像素设置大小时,字体中的所有字符都需要在该范围内,这意味着字母有降号,字母有升号。

    虽然我之前在这里发布的内容离目标不远,但它实际上不起作用。当我的头撞到这一点时,我发现有趣的是,graphics.MeasureString(“M”)报告的高度远远大于graphics.MeasureString(“MM”)报告的高度。在手工计算字体大小时,我发现第一个(与GetEMSize的响应相关)实际上是整行大小。最后,我意识到数字的实际字符大小不需要与任何度量相关联,无论是real还是.net。

    这是我尝试的第一件事。我刚刚又对它进行了测试:从Arial 10中,我得到了一个7像素高的“0”。这确实像预期的那样工作。你刚才试了一个A,做了一个
    A
    和一个
    y
    ,你会看到这条线的总高度是10。谢谢你的示例,但这不是我需要的。我需要的是第一个问题。我将以另一种方式在这里编写它:如何计算传递给Font()构造函数的大小,以便给定字体的glyph“0”(而不是字符串“Ay”)具有给定的高度?关于我的项目的更多细节:这是一个带有大屏幕的嵌入式设备,我需要为设计师提供一种简单的方法来生成和试用他们喜欢的位图字体。对我来说,生成这种位图的Windows工具似乎是一个很好的解决方案。基于GDI+的文本度量有点奇怪。查看普通的GDIAPI。关于垂直居中文本的其他一些问题可能会有所帮助。系统字体系统将始终为异常高或低的字符保留空间。为什么不试试“测试并解决”循环呢?打印字符零,并以编程方式测量其高度(以像素为单位)-例如,检查以确保至少十行像素水平方向上至少设置了一个位。如果失败,请将字体大小增加1,然后重试,直到成功。不幸的是,你必须裁剪掉未使用的像素行,因为会有一些重叠。是的,我有这样的想法,但我想把它作为最后的解决方案。我在看一个愚蠢的画图程序,不知怎么的,它能做到我所需要的(我告诉它“Arial 10”,它能精确地画出10像素高的文本),我希望有一个清晰的编程方法来做到这一点。。。