Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2009, 18:10   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию Изменение размера шрифта на шаг

Есть текстовый range. Как размер шрифта изменить на "шаг". Например, есть текст "Парам пам пам рурам", в котором "Парам" - 16 размер, "пам пам " - 20, "рурам" - 56. Как сделать размеры шрифтов из 16.20.56 - 15,5.19,5.55,5 (уменьшить каждый символ на 0.5) или 17.20.56 (увеличить на 1)?
У font-a есть методы Grow и Shrink, но они уменьшают/увеличивают к следующему доступному значению.

Думаю, можно пробежаться по каждому символу, изменяя его. Можно ли это сделать как то быстрее? Например не по символам, а по пучками? Можно ли разбить исходный range на более мелкие range-ы внутри с одинаковым размером font-a, будет ли это быстрее?
Diego__ вне форума Ответить с цитированием
Старый 11.12.2009, 18:36   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

А свойства Size ты у Font'а не увидел?
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 11.12.2009, 19:04   #3
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Немного не то. У меня получается range с различными размерами. Если я ему делаю
range->GetFont()->Size += 0.5f;
получаю исключение.
если
float prevSize = range->GetFont()->GetSize();
range->GetFont()->PutSize(prevSize + 0.5f);
весь текст становится одинакового размера

Можно ли разбить исходный range на более мелкие range-ы внутри с одинаковым размером font-a? Пока вижу решение в виде создания range-a для каждого символа отдельно и соответственное изменение размера. Кажется, это будет весьма медленно
Diego__ вне форума Ответить с цитированием
Старый 11.12.2009, 19:40   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

У Range есть коллекция Characters, каждый элемент которой является отдельным символом и имеет тип Range. Такой вот полиморфизм. Вот набросал:
Код:
Sub SameFontSizeRange()
  Dim oChar As Range
  Dim oRng As Range
  Dim oSameFontSizeRange As Range
  Set oRng = Selection.Range
  Set oSameFontSizeRange = Selection.Range: oSameFontSizeRange.Collapse wdCollapseStart
  While oSameFontSizeRange.Start < oRng.End
    'Раздвигаем диапазон, пока размер шрифта следующего символа равен размеру шрифта текущего символа
    While oSameFontSizeRange.Font.Size = ActiveDocument.Characters(oSameFontSizeRange.End + 1).Font.Size
      oSameFontSizeRange.SetRange oSameFontSizeRange.Start, oSameFontSizeRange.End + 1
    Wend
    'Тут уже получаем Range с одинаковым шрифтом.
    Debug.Print "Размер шрифта: " & oSameFontSizeRange.Font.Size & "; Текст: """ & oSameFontSizeRange.Text & """"
    oSameFontSizeRange.Collapse wdCollapseEnd
  Wend
End Sub
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 11.12.2009, 19:41   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

рекомендую попробовать встроенную фукнцию

выделите текст и нажмите сочетание клавиш: Ctrl-ъ

если не сработает:
меню - Сервис - Настройка - кнопка "Клавиатура"
слева выберите "Все команды"
справа найдите GrowFontOnePoint
посмотрите, какое сочетание клавиш назначено (или назначьте своё). Затем выделите текст и нажмите это сочетание...

оно?..

_______________________________
оп-с... похоже ТС нужно это реализовать в коде VBA...
на VBA это выглядит так:
Selection.Font.Size = Selection.Font.Size + 1

или я чего-то не понял?...

Последний раз редактировалось Serge_Bliznykov; 11.12.2009 в 19:44.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.12.2009, 19:50   #6
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

TC это нужно реализовать на «плюсах»
Код:
Selection.Font.Size = Selection.Font.Size + 1
Не прокатит, если шрифт в выделении разного размера
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 11.12.2009, 21:41   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Цитата:
Selection.Font.Size = Selection.Font.Size + 1
Не прокатит, если шрифт в выделении разного размера
согласен.
Тупой рекордер под MS Word записал VBA код, который Word не может выполнить!! ;( и непонятно, почему есть увеличение размера шрифта до следующего порогового значения: Font.Grow, но нет Font.GrowFontOnePoint Как же то Word по Ctrl-[ и Ctrl-] выполняет эту операцию?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2009, 22:45   #8
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Посимвольное форматирование

Цитата:
Сообщение от Diego__ Посмотреть сообщение
Думаю, можно пробежаться по каждому символу, изменяя его. Можно ли это сделать как то быстрее?
Бежим по символам — имитацией нажатия стрелки вправо (в файле жмите на F6).
Код:
Sub LetterWave()
Static s
Static i

If s = vbEmpty Then s = MsgBox("+0,5?", vbQuestion + vbYesNoCancel)
If i = vbEmpty Then i = 0.5
If s = vbNo Then s = MsgBox("–0,5?", vbQuestion + vbYesNoCancel): i = -0.5
If s <> vbYes Then MsgBox "Bye-bye! Закройте документ.": Exit Sub
    
    With Selection.Font
    
    SendKeys "+{right}", True 'выделение (Shift-стрелка вправо)'
    .Size = .Size + i
    SendKeys "{right}", True 'снятие выделения (стрелка вправо)'
    
    End With
End Sub
Быстрее — превратить текст в контуры (я это делал с помощью xara.exe) и сжимать/растягивать.
Вложения
Тип файла: doc PickFont.doc (33.5 Кб, 13 просмотров)

Последний раз редактировалось Sasha_Smirnov; 13.12.2009 в 18:20. Причина: ответы.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 16.12.2009, 18:02   #9
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

viter.alex, спасибо за пример.
На плюсах реализовал так:
Код:
int charactersCount = m_Document->Characters->GetCount();
int charactersInRangeCount = totalRange->ComputeStatistics(Word::wdStatisticCharactersWithSpaces);
int firstCharacter = charactersCount - charactersInRangeCount - 1;

Word::CharactersPtr characters = m_Document->Characters;
Word::RangePtr currentRange = characters->Item(firstCharacter);

float currentFontSize = currentRange->Font->Size;
for (int i = firstCharacter + 1; i <= charactersCount; ++i)
{
	if (currentFontSize == characters->Item(i)->Font->Size)
		currentRange->SetRange(currentRange->Start, currentRange->End + 1);
	else
	{
		currentRange->Font->Size = currentFontSize + increase;
		currentRange = characters->Item(i);
		currentFontSize = currentRange->Font->Size;
	}
}
currentRange->Font->Size = currentFontSize + increase;
Diego__ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение шрифта в списке Vill Общие вопросы Delphi 1 05.12.2009 01:08
Изменение размера шрифта Nando Microsoft Office Excel 4 07.03.2009 16:45
При изменении размера шрифта в IE появляются линии Константин_VRN HTML и CSS 7 12.01.2009 16:42
Изменение шрифта отдельных символов Melevir Помощь студентам 1 13.09.2008 14:52
Изменение размера шрифта выводимого текста в консоле, как побороть? Artefact Qt и кроссплатформенное программирование С/С++ 0 26.02.2008 00:28