【发布时间】:2012-01-16 03:18:43
【问题描述】:
我已经尝试了所有建议的使文本居中的方法,但在使单个字符居中时似乎无法获得我想要的结果。
我有一个矩形。在那个矩形中,我用 DrawEllipse 画了一个圆。现在我想使用相同的矩形和 DrawString 在圆内绘制一个字符,使其完全居中。
这是我的基本代码:
StringFormat stringFormat = new StringFormat();
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
using (Graphics g = Graphics.FromImage(xImage))
{
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.AntiAlias;
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
g.FillEllipse(fillBrush, imageRect.X, imageRect.Y, imageRect.Width - 1, imageRect.Height - 1);
g.DrawString(Text, font, Brushes.White, imageRect, stringFormat);
}
文本水平居中...但垂直居中不正确。使用像大写“I”这样的对称字符,我发现字符的顶部总是比字符的底部更靠近矩形的边缘。距离可能至少增加了 50%。
我假设它为像小写“j”这样挂得更低的字符测量了足够的空间。但是,由于我正在尝试使用单个字母创建图形图标,因此我想要更精确的居中。
【问题讨论】:
-
您是否将 DrawString 方法的结果与 TextRenderer.DrawText 方法的结果与 HoriztonalCenter 和 VerticalCenter 的 TextFormatFlags 进行比较?
-
无复制。请注意,大写的 I 没有像 g 那样的下降。
-
我尝试了 TextRenderer.DrawText 并得到了类似的结果。
-
Hans:我的观点是,当我绘制没有下划线的字符时,它们以垂直居中的方式为不存在的下划线提供空白空间。因此,角色并没有真正居中。
-
我假设GDI没有办法做到这一点,所以我要做的是测量文本,创建一个测量大小的位图,在位图上绘制文本,锁定位,并获取实际包含数据(非透明像素)的子矩形的边界区域。然后在第一个 Rectangle 的中心位置位 blit 那个矩形。我认为应该可以工作,但性能会很糟糕。
标签: c# winforms gdi+ centering drawstring