在C#中完美对齐右侧绘制的文本

时间:2014-01-01 02:55:11

标签: c# winforms text drawing alignment

当我使用右对齐绘制文本时,字符串没有很好地对齐(我说的是水平对齐,我使字符串重叠以便比较更容易):

enter image description here

似乎字母周围有某种不可见的空间,每个字母的空间都不一样。 因此,对齐方式会有几个像素。

我尝试了几种方法,例如使用MeasureString,但没有成功。

Graphics g = Graphics.FromImage(pictureBox.Image);

FontFamily fontFamily = new FontFamily("Arial");
Font font = new Font(fontFamily, 32, FontStyle.Regular, GraphicsUnit.Pixel);
SolidBrush solidBrush = new SolidBrush(Color.FromArgb(255, 0, 0, 0));

StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Far;

g.DrawString("tree", font, solidBrush, new PointF(161, 80), stringFormat);
g.DrawString("car", font, solidBrush, new PointF(161, 100), stringFormat);
g.DrawString("l", font, solidBrush, new PointF(161, 120), stringFormat);
g.DrawString("M", font, solidBrush, new PointF(161, 140), stringFormat);

g.Dispose();

我确实找到了WPF的解决方案,应该使用Canvas.SetRight(textBlock, x);,然后你就可以完美对齐。

我仍然很好奇如何为WinForms做这件事。

1 个答案:

答案 0 :(得分:0)

由于您正在使用GDI +绘图。请查看为其提供的各种 TextRenderingHints 。来自Microsoft的网站

对于文本,字体高度会根据设备分辨率进行适当缩放:在96 dpi屏幕上绘制20像素高的字体在125 dpi屏幕上呈现25像素高,125像素高一台600 dpi的打印机。但是,单个字形的宽度将仅随高度缩放。确切的宽度还取决于字体中包含的提示指令,以便调整字形的形状(网格拟合)以便易读。

网格拟合 - TrueType提示的应用 - 是调整渲染字形中像素位置的过程,以使字形在屏幕尺寸上易于辨认。提示技术包括整个像素上字形词干的对齐以及字形的相似特征受到同等影响的保险。字体设计师花了很多时间来暗示每个字形。 例如,考虑Times New Roman字体中的字母“s”,“e”,“w”和“l”,使用GDI的标准网格拟合在各种分辨率下以8个点渲染。

看看http://msdn.microsoft.com/en-us/library/system.drawing.graphics.textrenderinghint(v=vs.110).aspx