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);
}
感謝您的信息,我最終使用的東西非常接近這個,雖然有Consolas字體,「numberOfCharacters」返回,這取決於你使用的字符。例如:「a」將返回50,如果我使用「」,它將返回一個不同的數字。我以爲Consolas是固定字體 - 等寬字體? –
最後,我得到寬度爲不同的字符與等寬字體相等的值,但是,''「 - 空間」給我負值「-3.813766E-7」,這很奇怪。有什麼建議? – Gondil
@Gondil:這是一個不可思議的結果,但是因爲您使用的是等寬字體,所以這很重要嗎?您可以只測量「m」的寬度(例如),並將其用作所有字符(包括空格)的寬度。 – MusiGenesis