Я нашел это: Можно ли посчитать, сколько символов поместится в метку фиксированной ширины, если шрифт указан на C#?
Это не сработало, у меня есть метка, и я хочу определить, сколько символов поместится в метке, чтобы я мог изменить содержимое перед назначением. Как я могу это сделать, по приведенной выше ссылке, которую я пробовал:
Graphics g = Graphics.FromHwnd(this.lblDestPathContent.Handle);
int intHeight, intWidth;
g.MeasureString(strPath, this.lblDestPathContent.Font
, this.lblDestPathContent.Size
, null, out intWidth, out intHeight);
this.lblDestPathContent.Text = strPath;
intWidth возвращается той же длины, что и strPath, и не помещается в метку.
lblDestPathContent — это System.Windows.Forms.Label.
[Изменить] Пример вышеизложенного:
strPath contains 154 characters
the size of the label is returned as {Width = 604, Height = 17}
Font is {Name = "Microsoft Sans Serif", Size=8.25}
После вызова MeasureString:
intWidth contains 154
intHeight contains 2
«Сколько символов» будет зависеть от символов, по крайней мере, для немоноширинных шрифтов. Итак, вам, вероятно, придется применить какую-то эвристику.
@shingo, что ты хочешь сказать? Согласно прототипу MeasureString, это правильные типы.
@Филдор, пожалуйста, объясни.... Я думал, исходя из размера шрифта и размера метки, достаточно просто увидеть, сколько символов поместится внутри метки, на основе всей предоставленной информации?
Да, у вас хорошее начало. Как только вы узнаете ширину строки, вы можете сравнить ее с шириной метки. Допустим, длина метки 100, а длина строки 150. Теперь вы можете, например, отрезать последнюю треть строки. Но в зависимости от символов в строке длина может оказаться 102. Так что, возможно, вам придется еще немного подумать.
Раньше я брал одиночный символ «W» шрифта (он самый широкий), измерял его ширину и принимал это как оценку «наихудшего случая».
@Fildor, из отладки strPath содержит 154 символа, размер метки – {Width = 604, Height = 17}, шрифт – {Name = 'Microsoft Sans Serif', Size = 8,25}, intWidth возвращается как 154, а intHeight равен возвращается как 2, поэтому я не совсем уверен, что делает MeasureString?
О, это кажется неправильным. Совсем.
@ Филдор, я согласен, но это то, что мне показывает отладчик.
@Fildor, исправлено, смотри мой ответ.





Мне удалось сделать то, что мне нужно:
string strModifiedToFit = strPath;
bool blnFit = false;
while(blnFit == false) {
Size szText = System.Windows.Forms.TextRenderer.MeasureText(strModifiedToFit,
this.lblDestPathContent.Font);
if (szText.Width < this.lblDestPathContent.Size.Width) {
blnFit = true;
} else {
strModifiedToFit = strModifiedToFit.Substring(strModifiedToFit.Length - (strModifiedToFit.Length - 1));
}
}
this.lblDestPathContent.Text = strModifiedToFit;
Вышеуказанное удаляет символ из пути до тех пор, пока он не поместится в метку.
Я бы подумал над ReadOnlySpan<char>, если это возможно.
В классе Graphics есть метод: g.MeasureString(text, font, layoutArea, stringFormat, out charactersFitted, out linesFilled); Кажется, charactersFitted — это то, что вам нужно. Хотя проблемы со шрифтами в WinForms никогда не бывают постоянными.
intWidth — это int, strPath — это строка, это разные типы.