Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

6 Март 2021, 16:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Переместить фрейм на задний план  (Прочитано 1331 раз)
0 Пользователей и 1 Гость смотрят эту тему.
JBrown
Участник
**
Offline Offline

Сообщений: 34


« Стартовое сообщение: 5 Октябрь 2019, 14:39 »

Здравствуйте.

Не могу понять как переместить врезку (TextFrame) на задний план средствами API вo Writer (Аналогично пункту в контекстном меню "Расположение->На задний план"). В описании API вроде бы нашел подходящий интерфейс (XShapeArranger), но как использовать его функции не понял. Пробовал просмотреть доступные функции программой XRay, но поддержки интерфейса XShapeArranger в TextFrame не увидел. Подскажите, пожалуйста, как перемещать объекты (не только врезки) на задний план.
Не очень получается понять иерархию всех этих сервисов и интерфейсов. Поэтому еще один вопрос. Как в описании API найти какой объект обладает интересующим интерфейсом (например, какой объект обладает интерфейсом XShapeArranger). Спасибо.
Записан
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 061


iMac, LibreOffice и Apache OpenOffice


« Ответ #1: 5 Октябрь 2019, 18:41 »

У врезки есть свойства: LayerID — которое располагает врезку относительно текста и ZOrder — которое располагает врезку относительно других графических объектов (кто кого перекрывает).

Код:
'oShape              'объект врезки
oShape.LayerID = 0   'перед текстом
oShape.LayerID = 1   'за текстом

oShape.ZOrder = 1    'находится над врезкой с ZOrder = 0, но под врезкой с ZOrder = 2

Ещё способ посмотреть методы и интерфейсы поддерживаемые объектом:
Код:
Sub main1
Dim oDrawPage, oObj

oDrawPage = ThisComponent.DrawPage
oObj = oDrawPage.getByIndex(0)                 'исследуемый объект (в данном случае графический)
msgbox(oObj.DBG_Methods, 0, "Методы")
msgbox(oObj.DBG_SupportedInterfaces, 0, "Интерфейсы")
End Sub
Записан

JBrown
Участник
**
Offline Offline

Сообщений: 34


« Ответ #2: 8 Октябрь 2019, 22:12 »

Немного поэкспериментировал. Пробовал на линиях и прямоугольниках. Свойства LayerID и ZOrder ведут себя ожидаемо. С TextFrame все получилось не так. Во-первых свойства LayerID у TextFrame нет и ZOrder ведет себя особенно.
В новом документе создал несколько врезок (TextFrame). Расположил их на странице так, чтобы они накладывались друг на друга. Далее менял свойство ZOrder для каждого из них. Получилось, что записываемое в ZOrder число это не желаемый "уровень" нахождения врезки, а ZOrder врезки, уровень которого понижается на 1. Все что ниже уровнем тоже понижается на 1, а врезка с ZOrder, равным 0, получает уровень первого из понижаемых. Все что выше не затрагивается. Оказалось,что не имеет значения от какой врезки вызывать изменение ZOrder.
Попробовал добавить врезку внутрь другой врезки и тоже менять ZOrder. Получилось, что через ZOrder можно "спрятать" внутреннюю врезку за внешнюю и ее не будет видно. Через контекстное меню Arranger (не через API) такого сделать не получилось. Видимо пункты контекстного меню Arranger реализуются не одним вызовом метода, изменяющего ZOrder, а более хитро.
У TextFrame есть свойства TextFlow(обтекание) и Opaque(непрозрачность относительно текста). Если установить TextFlow=THROUGH (сквозное обтекание) и Opaque=FALSE, то TextFrame переместится за текст (видимо это аналог LayerID?) при этом ZOrder не меняется.
Теперь вопрос: Zorder для TextFrame действительно так должен работать или я чего-то перемудрил?
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!