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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.09.2009, 13:45   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию Как в WordArt задавать верхний и нижний выносные элементы(ascender/descender)?

Создаю WordArt:
Word::ShapePtr wordArt = m_WordDocument->Shapes->AddTextEffect(Office::msoTextEffec t1, L"Param pam pam", L"Arial", 16, Office::msoFalse, Office::msoFalse, m_AppWord->CentimetersToPoints(1), m_AppWord->CentimetersToPoints(1));

задаю размер
wordArt->PutWidth(CentimetersToPoints(3)) ;
wordArt->PutHeight(CentimetersToPoints(1) );


здесь все хороошо.

Ручками в документе редактирую мое "Param pam pam", убираю все буквы 'p' образуется текст без верхних и нижних выносных элементов "aram am am". При этом объект WordArt растягивается на всю высоту заданную ранее 3х1. Как задать учет верхнего и нижнего выносных элементов? Т.е. чтобы при редактировании фразы высота символов не изменялась.

В прикреплении файл демонстрирующий данную проблему

Верхний и нижний выносные элементы это, например: b,t,i,f - имеют верхний выносной элемент; q,p, - имеют нижний выносной элемент. a,w,e, s, o - не имеют данных элементов. Все большие символы имеют верхний выносной элемент ABCDEF
Вложения
Тип файла: doc wordArt.doc (26.0 Кб, 19 просмотров)
Diego__ вне форума Ответить с цитированием
Старый 04.09.2009, 19:20   #2
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Существует программа "Nitro pdf" редактор pdf файлов. В ней есть возможность конвертации pdf файлов в doc. Повернутый pdf текст конвертируется в WordArt. Результат конвертации простенького файла в прикреплении.

Как видно из файла нужный эффект можно реализовать. Но, как?

Пробовал:
1. Пересохранял данный файл в docx формат. docx - это заархивированный xml. Переименовываю docx в zip, открываю архив, в полученных файлах открываю document.xml. Нахожу свое "Param pam pam".

2. Таким же образом поступаю с файлом созданным моей программой. Т.е. у меня 2 файла document.xml, первый созданный "Nitro pdf", второй созданный мной. Смотрю отличия... Ниже привожу упрощенный вид xml файлов. В них удалено все что не относится к "param pam pam" и то, что у 2х версий xml одинаковое.

Nitro PDF
<w:r>
<wict>
<v:shape style="z-index:-1" o:allowincell="f"stroked="f">
<o:extrusion v:ext="view" autorotationcenter="t"/>
<v:textpath string="Nitro"/>
</v:shape>
</wict>
</w:r>



MОЁ
<w:r>
<wict>
<v:shape style="z-index:251658240" >
<v:textpath trim="t" fitpath="t" string="Our"/>
</v:shape>
</wict>
</w:r>

Пробую менять атрибуты моего xml и подсовывать его в архив, архив переименовываю в docx, открываю.

Положительный результат получаю при удалении из моего варианта атрибута trim="t". Не могу найти соответствие данному атрибуту в модели Word.
Подскажите, что это может быть?
Вложения
Тип файла: doc rotated wordArt.doc (26.5 Кб, 12 просмотров)
Diego__ вне форума Ответить с цитированием
Старый 05.09.2009, 03:36   #3
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Вариант. Cоздайте "правильный" шейп вручную, откорректировав
VML в MSE (Alt-Shift-F11), маркируйте его. и сделайте невидимым (
Новые шейпы создавайте копированием на его базе.
Т.е идея состоит в предварительном создании в документе VML template для ваших шейпов.
А так как на самом деле Вы пишите на C++, а не на VBA, ничто не мешает сохранить документ как XML/HTML
подправить VML и переоткрыть с сохранением как DOC

Последний раз редактировалось Aent; 05.09.2009 в 03:40.
Aent вне форума Ответить с цитированием
Старый 07.09.2009, 12:40   #4
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Спасибо, Aent, Вы открыли мне Америку (Alt-Shift-F11). Было чувство, что все может быть проще

Идея с шаблоном весьма интересна. Но не хочется его хранить, желательно создавать на лету. Существует программная возможность редактирования XML? Можете привести простенький пример доступа к объектам XML?

Планирую создавать шейп как создавал и убирать из его тега атрибут trim="t". Как это лучше сделать?
Diego__ вне форума Ответить с цитированием
Старый 07.09.2009, 14:20   #5
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Diego___, MSE к сожалению не поддерживает автоматизацию. Доступа к
HTML представлению документа через объектную модель Word 2003 то же нет. Максимум можно попробовать через Sendkey, но IMHO это не решение.
Боюсь, максимум что я могу предложить, это динамическое создание файла шаблона с шейпом по макету, заданному в программе как константа. Потом шейп можно копировать или вставлять фрагмент с помощью поля INCLUDETEXT. Что нибудь вроде:
{INCLUDETEXT "c:\\Example\\WordArt.xml" \c XML \* MERGEFORMAT}

Можно ещё сохранить документ как HTML и внести изменения через DOM, но IMHO это медленный и тупиковый путь. Мне кажется что если уж править сохранённый HTML, то как простой текстовый файл.
Есть ещё один непростой путь. Сделать вручную нужный шейп-шаблон забрать его в клипбоард.
Сохранить через API содержимое Clipboard как бинарные данные и затем встроить этот код в программу.
С тем, что бы она в нужный момент помещала шейп в буфер обмена. Я что то похожее несколько лет назад делал.
Для фрагментов текста. Но опять же, IMHO, "овчинка не стоит выделки"
А шаблон получается очень маленький см. аттачмент.
Причём я не выбрасывал лишних строк.
Вложения
Тип файла: zip wordArt.zip (2.4 Кб, 13 просмотров)

Последний раз редактировалось Aent; 07.09.2009 в 17:55.
Aent вне форума Ответить с цитированием
Старый 07.09.2009, 17:53   #6
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Я поджал код XML (c сохранением читабельности)
В примере в документ из текущего каталога документа вставляется
шейп, заданный XML/VML описанием. Вставка осуществляется с использованием поля INCLUDETEXT. Обратите внимание на относитльную адресацию
Вложения
Тип файла: zip Example.zip (4.1 Кб, 12 просмотров)

Последний раз редактировалось Aent; 07.09.2009 в 18:02.
Aent вне форума Ответить с цитированием
Старый 08.09.2009, 12:14   #7
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Спасибо, Aent. Вы мне сильно помогли.

Я не так давно занимаюсь Word-oм, VBA для меня загадка, не все из вышесказанного ясно представляю. Можете объяснить "Вставка осуществляется с использованием поля INCLUDETEXT. Обратите внимание на относительную адресацию" - это из XML/VML или VBA? INCLUDETEXT - что это?

на С++ сделал так:

VARIANT path;
path.vt = VT_BSTR;
path.bstrVal = ::SysAllocString(L"C:\\word tamplate.xml"); // Ваш xml

Word::DocumentPtr m_WordDocument = m_AppWord->Documents->Open(&path);

...

CComVariant firstShape(1);
Word::ShapePtr wordArt = m_WordDocument->Shapes->Item(&firstShape)->Duplicate(); // Копирую исходный WordArt
...
wordArt->TextEffect->FontSize = 20;
wordArt->TextEffect->PutFontName(L"Times New Roman");
wordArt->TextEffect->PutText("Success");

wordArt->PutLeft(m_AppWord->CentimetersToPoints(5.f));
wordArt->PutTop(m_AppWord->CentimetersToPoints(3.f));

m_WordDocument->Shapes->Item(&firstShape)->Delete(); // Удаляю исходный WordArt

требуемый эффект достигнут.
Diego__ вне форума Ответить с цитированием
Старый 08.09.2009, 13:56   #8
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

INCLUDETEXT это поле (элемент коллекции Fields) MS Word. Поля это вид
объектов Word. C помощью этого поля указывается источник для вставки
текста в документ. Шейп который вы увидели в .doc в моём примере
вставляется с помощью этого поля. Его код можно увидеть нажав Alt-F9
{INCLUDETEXT "{FILENAME \p }//..//wa.xml" \* MERGEFORMAT}
Файл wa.xml ищется в том же каталоге что и исходный документ.
Cинтаксис в этом случае не очевиден
Фигурные скобки вводятся с помощью Ctrl-F9. Они не могут быть
набраны (вставлены) как текст.
Естественно, поля можно добавлять динамически методом .add
Aent вне форума Ответить с цитированием
Старый 11.09.2009, 18:42   #9
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Столкнулся с еще одной проблемой.

На основе Вашего xml открываю документ
Код:
VARIANT path;
path.vt = VT_BSTR;
path.bstrVal = ::SysAllocString(L"C:\\wa.xml");

m_WordDocument = m_AppWord->Documents->Open(&path);
и методом Duplicate размножаю WordArt-ы.

Как после ->Duplicate() переместить WordArt на нужную страницу? Получается, копии у меня всегда на 1ой странице.

Чуть ранее я использовал selection. Было все просто: переходил на нужную страницу и вставлял копию. От этого объекта пришлось отказаться. Мне нужно чтобы во время работы моего приложения корректно работал сам Word, т.е. чтобы мои действия не мешали пользователю изменять его документ.

Мне известно как создать новый WordArt не на основе шаблона, передать последним параметром anchor - range в кот. вставляю новый шейп.
Код:
VARIANT anchor;
Word::RangePtr range = ...;

anchor.vt = VT_DISPATCH;
anchor.pdispVal = range;

wordArt = m_Shapes->AddTextEffect(... &anchor);
Как можно задать anchor или сместить WordArt на другую страницу?
Diego__ вне форума Ответить с цитированием
Старый 11.09.2009, 23:20   #10
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Цитата:
Мне нужно чтобы во время работы моего приложения корректно работал сам Word, т.е. чтобы мои действия не мешали пользователю изменять его документ.
Эта фраза непонятна. Что мешает перед изменением запоминать и потом
восстанавливать Selection?
Вариант: Я не очень понимаю, что вам мешает переместить шейп через буфер. Но можно, как я предложил раньше,
работать не с шейпом а с динамически добавляемым полем INCLUDETEXT.
Добавляете поле для нужного ранга, обновляете и разрываете связь (unlink). В результате вы фактически добавите новый шейп на основе шаблона с привязкой к местоположению поля.
Кстати, Александр, если не секрет а что вы пишете? PDF converter ?

Последний раз редактировалось Aent; 11.09.2009 в 23:39.
Aent вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в lable задать степень (нижний и верхний регистр) Polotenchik Общие вопросы Delphi 17 17.07.2009 23:30
как задавать клавиши в Меню StudentPolitech Помощь студентам 1 10.12.2008 02:17
не просто текст, а как word или wordArt andrey4623 Общие вопросы Delphi 2 29.12.2007 21:11
Как задавать параметры в EXE ???? ПОМОГИТЕ! UnD)eaD)Snake Общие вопросы Delphi 2 22.07.2007 17:28
КАК поместить ИКОНКУ программы в правый нижний угол панели(там где пуск)??? micaell Общие вопросы Delphi 5 21.02.2007 19:58