2010-04-19 1 views
1

У меня длинная строка, например: «Пожалуйста, помогите мне решить эту проблему». Эта строка настолько длинная, чтобы она была в ширину 100 пикселей. Мне нужно получить подстроку этой строки, а подстрока будет соответствовать 100 пикселям. Пример: подстрока «Please help me to sol» подходит в 100 пикселей.Найти самую длинную начальную подстроку, которая имеет ограниченную ширину

Пожалуйста, помогите мне, как оценить подстроку следующим образом. Благодарю.

Мое приложение - Win Forms и C#.

+0

Вы работаете в среде с частичным доверием, или вы можете позвонить неуправляемого кода ? –

+0

@ Lu Lu: есть 3 хороших ответа здесь ... –

ответ

1

Как обычно, Win32 API имеет функцию, предназначенный именно для этого: GetTextExtentExPoint

P/ссылаться на объявление: http://pinvoke.net/default.aspx/gdi32/GetTextExtentExPoint.html

+2

На самом деле похоже, что класс 'System.Drawing.Graphics' имеет аналогичную перегрузку для' MeasureString': http://msdn.microsoft.com/en-us/library/957webty(v=VS.100).aspx –

+0

Так оно и есть. Кто из нас должен поместить эту ссылку на страницу pinvoke.net (в разделе «эквивалентный управляемый API»)? –

+0

ooooooh. Приятно отметить измерительную перегрузку, никогда не замечал. –

0

это должно работать ... пока на самом деле не испытано и не оптимизаций, хотя

var g = Graphics.FromImage(someimage); // or any from hwnd etc... should use your panel/whatever 
var f = new Font("YOURFONT", 12f, FontStyle.Regular, GraphicsUnit.Pixel); // replace with your vals 
var yourtext = "yourtextyourtextyourtextyourtextyourtext"; 
while (g.MeasureString(yourtext, f).Width > 100) 
    yourtext = yourtext.Remove(yourtext.Length - 2, 1); 
+0

Я думаю, что это должно быть g.MeasureString (ваш текст ... вместо g.MeasureString («ваш текст» ... – juharr

+0

'yourtext' не следует указывать в в то время как условие. –

+0

Кажется, что это было бы очень медленно для строк длиной дольше 100 символов. –

0

Если все, что вы ищете хорошую оценку, вы могли бы сначала измерить ширину репрезентативной строки для определения среднего ширину символа вашего шрифта один раз. Хорошим представителем может быть не просто алфавит; вы можете искать гистограмму частоты символов, чтобы получить лучшую среднюю ширину.

string Representative = "abcdefghijklmnopqrstuvwxyz"; 
float CharacterWidth; 

using(Bitmap b = new Bitmap(0, 0)) 
using(Graphics g = Graphics.FromImage(b)) 
using(Font f = /* some font definition */) 
{ 
    CharacterWidth = g.MeasureString(Representative, f).Width/Representative.Length; 
} 

Затем используйте это, чтобы определить, сколько символов будет соответствовать N пикселам.

string Text = ... 

int DisplayWidth = 100; 

int FitLength = Math.Min(Text.Length, (int)(DisplayWidth/CharacterWidth)); 
string FitText = Text.Substring(0, FitLength); 
+0

@abatishchev: Спасибо за редактирование, я не понимал, что вы можете складывать «используя» утверждения таким образом. Как удобно! –