Программно настроить размер шрифта, чтобы он соответствовал тексту внутри текстового поля в Word - PullRequest
1 голос
/ 08 января 2009

Одно из моих приложений занимается созданием / редактированием / форматированием MS Word и документов. Я использую Office 2007 с VS 2008, и я пишу для библиотеки Microsoft.Office.Interop.Word, которая работает с 2003 или 2008.

Я создаю текстовое поле в документе с помощью метода Document.Shapes.AddTextbox, а затем заполняю его текстом. Я хотел бы иметь возможность программно определять, соответствует ли текст текстовому полю, и если нет, то уменьшать размер шрифта до тех пор, пока он не будет.

Я пробовал пару разных методов:

1) с использованием свойства bool Shape.TextFrame.Overflowing

while (textbox.TextFrame.Overflowing) // adjust font size

однако, это возвращает TRUE, хотя когда я открываю документ, я вижу, что текст помещается в поле.

2) проверка позиции X / Y последнего символа текста и проверка того, попадает ли эта координата в границы текстового поля

lastCharX = System.Convert.ToSingle (tb.TextFrame.TextRange.Characters.Last.get_Information (WdInformation.wdHorizontalPositionRelativeToPage));
lastCharY = System.Convert.ToSingle (tb.TextFrame.TextRange.Characters.Last.get_Information (WdInformation.wdVerticalPositionRelativeToPage));
bool outsideFrameBoundaries = lastCharX + lastCharWidth > frameBoundaryX || lastCharY + lastCharHeight > frameBoundaryY;

однако, это возвращает X / Y, которые почти всегда находятся внутри поля, хотя, когда я открываю документ, я не вижу символ, потому что он не помещается в поле.

Так что у меня заканчиваются идеи здесь, и я спрашиваю, прошел ли кто-нибудь еще через это раньше и есть ли у них предложения по борьбе с неточным беспорядком, который является словом interop?

1 Ответ

1 голос
/ 09 января 2009

Я придумал решение.

Это началось, когда я разобрался с методом безумия Ворда. Когда я получаю координаты X / Y для символа, и этот символ существует за пределами области текстового поля, тогда Word фактически возвращает правильное значение X, но значение Y является значением Y последней видимой строки в текстовом поле.

Так что я сканирую все символы, начиная с конца, и если я нахожу повторяющиеся координаты, то я знаю, что есть переполнение. Я также должен проверить, больше ли значение Y + размер шрифта, чем нижняя граница текстового поля. Но это, кажется, работает довольно надежно (если медленно) для обнаружения переполнения текстового поля. Как только я определю, переполнен ли он, я продолжаю уменьшать размер шрифта, пока он не станет равным.

...