【发布时间】:2012-08-18 04:56:18
【问题描述】:
在我的程序中,我需要生成一个位图,其中包含从左到右排列的所有数字字符 (0..9),以及一些其他字符。
用户将从 UI 中选择:
- 所需的字体,以及
- 所需的字符高度(以像素为单位)。
所以我想创建一个位图,然后从这个位图中创建一个图形,然后将数字一个一个地绘制到这个位图中,然后将它保存到磁盘。
几个小时后我无法弄清楚的事情: 如何创建正确大小的字体,以使数字“0”具有用户指定的高度?
我使用了 Font 构造函数中的所有参数,使用 StringFormat 的属性,使用 MeasureString/MeasureText/MeasureCharacterRanges,我尝试通过 P/Invoke(使用正/负 nHeight)使用本机 CreateFont() 创建字体。所有称为“大小”或“高度”的参数似乎都表示某个比“0”大得多的假设字符的大小。
我确实阅读了有关线高、em 高度、上升、下降等的理论。似乎没有关于字符的 真实高度的概念,没有填充和间距等 p>
又是我的问题:给定“0”字形的字体名称和所需的像素高度,我如何创建一种字体来绘制具有所需高度的字形?
如有任何指导,我将不胜感激。
稍后编辑 关于我的项目的更多细节:它是一个带有大显示屏的嵌入式设备,我需要为设计人员提供一种简单的方法来生成和尝试他们喜欢的位图字体。生成此类位图字体的 Windows 工具对我来说似乎是一个很好的解决方案。
【问题讨论】:
-
基于 GDI+ 的文本测量有点奇怪。查看普通的 GDI API。关于垂直居中文本的其他一些问题可能会有所帮助。
-
系统字体系统将始终为异常高或低的字符保留空间。为什么不尝试“测试和解决”循环呢?打印字符零,并以编程方式测量其高度(以像素为单位) - 例如检查以确保水平方向至少十行像素至少设置了一位。然后如果失败则将字体大小增加一并重试直到成功。不幸的是,您必须剪掉未使用的像素行,因为会有一些重叠。
-
是的,我想到了这样的事情,但我想把它作为最后的解决方案。我正在查看愚蠢的 Paint 程序,它以某种方式设法完全满足我的需要(我告诉它“Arial 10”,它绘制的文本正好是 10 像素高),我希望有一种明确的编程方式来做到这一点......
标签: c# winforms fonts font-size