给定一些像素(例如:300)和一个字体(固定类型,固定大小,如Consolas),如何确定我可以使用 GDI + 绘制的最大字符数?
文本不会写入Label等,而是使用GDI +绘制:
public void DrawString( string s, Font font, Brush brush,
RectangleF layoutRectangle, StringFormat format );
但是我想在绘制之前执行某些文本操作,因此我想知道我可以安全输出的最大字符数。
答案 0 :(得分:6)
System.Drawing.Graphics
方法MeasureString
使用一些额外像素填充字符串宽度(我不知道为什么),因此测量一个固定长度字符的宽度,然后将其除以可用的最大宽度会给出最大宽度的字符数估计得太低。
要获得最大字符数,您必须按照以下方式执行迭代:
using (Graphics g = this.CreateGraphics())
{
string s = "";
SizeF size;
int numberOfCharacters = 0;
float maxWidth = 50;
while (true)
{
s += "a";
size = g.MeasureString(s, this.Font);
if (size.Width > maxWidth)
{
break;
}
numberOfCharacters++;
}
// numberOfCharacters will now contain your max string length
}
更新:您每天都会学到新东西。 Graphics.MeasureString(和TextRenderer)用一些额外的像素填充边界以容纳悬垂的字形。有道理,但它可能很烦人。参见:
http://msdn.microsoft.com/en-us/library/6xe5hazb.aspx
看起来更好的方法是:
using (Graphics g = this.CreateGraphics())
{
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
SizeF size = g.MeasureString("a", this.Font, new PointF(0, 0),
StringFormat.GenericTypographic);
float maxWidth = 50; // or whatever
int numberOfCharacters = (int)(maxWidth / size.Width);
}
答案 1 :(得分:3)
还有TextRenderer.MeasureText(),它产生不同的结果(这是绘制窗口控件时使用的,因此通常更准确)。
关于它的某个地方有一个关于它的讨论,但我现在找不到它。
修改: This MSDN Article更深入一点。
答案 2 :(得分:1)
我阅读了几个网站并提出了解决方案,
using (System.Drawing.Graphics graphics = CreateGraphics())
{
System.Drawing.Size size = TextRenderer.MeasureText(graphics, id, e.Appearance.Font);
if (size.Width > e.Column.Width)
{
int charFit = (int)(((double)e.Column.Width / (double)size.Width) * (double)id.Length);
if (id.Length - charFit + 2 < id.Length)
{
e.DisplayText = string.Format("{0}{1}","...", id.Substring(id.Length - charFit + 2));
}
}
}
我在DevExpress网格视图的CustomDrawCell事件中进行了此更改。 如果您发现此解决方案存在任何缺陷,请与我们联系。
答案 3 :(得分:0)
您可以使用Drawing.Graphics.MeasureString()来获取其中一个字形的大小 然后只需检查它们中有多少适合您的绘图区域。
答案 4 :(得分:0)
如果是固定宽度,为什么不使用floor(pixelcount / fontwidth)?
答案 5 :(得分:0)
我认为System.Drawing.Graphics.MeasureString()可以帮到你。您可以将它与MeasureCharacterRanges结合使用,或者测量一个字符的大小,然后将该值除以像素数。像这样的东西,你可以玩结果让它工作。我相信这将是有效的解决方案,所以请询问是否有不清楚的地方=)
答案 6 :(得分:0)
虽然这是一个迟到的回复,但我遇到了同样的问题。
我认为你问题的答案就在你的问题中。你提到的函数DrawString函数有自动修剪长字符串的功能。请查看文档http://msdn.microsoft.com/en-us/library/19sb1bw6.aspx。
该函数将修剪字符串,使其适合布局矩形。您必须将作为参数传递的stringformat对象的修剪属性设置为非none。