Это довольно простой алгоритм, который можно написать самому, если вы нигде его не найдете - псевдокод будет выглядеть примерно так:
if theString.Length > desiredWidth:
theString = theString.Left(desiredWidth-3) + "...";
или если вы хотите многоточие в начале строки, эта вторая строка будет:
theString = "..." + theString.Right(desiredWidth-3);
или, если хотите, посередине:
theString = theString.Left((desiredWidth-3)/2) + "..." + theString.Right((desiredWidth-3)/2 + ((desiredWidth-3) mod 2))
Edit:
Я предполагаю, что вы используете MFC. Поскольку вы хотите использовать шрифты, вы можете использовать функцию CDC :: GetOutputTextExtent . Попробуйте:
CString fullString
CSize size = pDC->GetOutputTextExtent(fullString);
bool isTooWide = size.cx > desiredWidth;
Если он слишком большой, тогда вы можете выполнить поиск, чтобы попытаться найти самую длинную строку, которая вам подходит; и это может быть настолько умный поиск, насколько вы хотите - например, вы можете просто попробовать «Hello Worl ...», а затем «Hello Wor ...» и затем «Hello Wo ...»; удаление одного символа, пока вы не найдете его подходит. В качестве альтернативы, вы можете выполнить бинарный поиск - попробуйте "Hello Worl ..." - если это не сработает, тогда просто используйте половину символов исходного текста: "Hello ..." - если что подходит, попробуйте на полпути между ним и: «Привет Wo ...», пока не найдете самый длинный, который все еще подходит Или вы можете попробовать оценить эвристику (разделить общую длину на желаемую длину, пропорционально оценить необходимое количество символов и выполнить поиск по ней.
Простое решение выглядит примерно так:
unsigned int numberOfCharsToUse = fullString.GetLength();
bool isTooWide = true;
CString ellipsis = "...";
while (isTooWide)
{
numberOfCharsToUse--;
CString string = fullString.Left(numberOfCharsToUse) + ellipsis;
CSize size = pDC->GetOutputTextExtent(string);
isTooWide = size.cx > desiredWidth;
}