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

Одно из моих приложений связано с созданием/редактированием/форматированием 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, которые почти всегда находятся внутри поля, хотя, когда я открываю документ, я не вижу символ, потому что он не помещается в поле.

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


person PhilChuang    schedule 08.01.2009    source источник


Ответы (1)


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

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

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

person PhilChuang    schedule 08.01.2009