Переместить фрейм на задний план

Автор JBrown, 5 октября 2019, 14:39

0 Пользователи и 1 гость просматривают эту тему.

JBrown

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

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

rami

У врезки есть свойства: 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

Немного поэкспериментировал. Пробовал на линиях и прямоугольниках. Свойства 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 действительно так должен работать или я чего-то перемудрил?