как я могу заблокировать фигуры в PowerPoint?

Я работаю над надстройкой для PowerPoint 2010 (C#) и хочу запретить конечному пользователю перемещать или редактировать все фигуры, которые я создал программно.

Я уже искал в рамках, но я думаю, что это не разрешено программно. Кто-нибудь уже сталкивался с такими ограничениями и может помочь мне найти решение?

Я знаю, что некоторые люди создают свою надстройку благодаря C++, потому что в офисе много ограничений.


person monstergold    schedule 05.08.2013    source источник
comment
Вопрос отредактирован: я старался быть максимально точным   -  person monstergold    schedule 05.08.2013
comment
В объектной модели нет ничего, что позволяло бы вам блокировать фигуры PowerPoint. Есть способ сделать это через XML, лежащий в основе PPT 2007 и более поздних версий. Проверьте эту ветку на наличие ссылки на Джона Уилсона, который разработал, как это сделать: answers.microsoft.com/en-us/office/forum/office_2007-powerpoint/ Другой подход заключается в перехвате события изменения выбора, и если вновь выбранная фигура является заблокированной, верните ее в известную позицию после того, как выбор снова изменится.   -  person Steve Rindsberg    schedule 05.08.2013
comment
Я нашел этот пример кода для обнаружения всех событий, происходящих благодаря commandsBars.OnUpdate : code.msdn .microsoft.com/ Это работает, но это не идеальное решение.   -  person monstergold    schedule 06.08.2013


Ответы (2)


Я нашел два решения:

  • Во-первых, нужно перехватывать все события из «commandBars.OnUpdate», как в этом замечательном примере кода: http://code.msdn.microsoft.com/CSExcelNewEventForShapes-0e26b1f2#content Затем вы можете указать положение/цвет или все, что хотите, для своей формы.
  • Второй более «жестокий» > сразу снимите выделение с формы. Когда вы поймаете все события из «CommandBars.OnUpdate», сделайте следующее:

Чтобы увидеть, какая форма выбрана:

var selectedShape = this.Application.ActiveWindow.Selection.ShapeRange[1]

Во всех моих фигурах я установил тег с идентификатором. Мне нужно просто проверить, есть ли идентификатор в тегах selectedShape, и если это так:

this.Application.ActiveWindow.Selection.Unselect();

Затем я показываю messageBox, чтобы предупредить пользователя не выбирать такую ​​форму. Мне не нравится это решение, но это единственное, что я нашел, и оно работает.

person monstergold    schedule 21.08.2013
comment
Вы перехватываете встроенное поведение PowerPoint неестественным образом. Что, если пользователь нажмет кнопку отмены после того, как вы отмените выбор формы? Форма выбирается снова. Мой совет: никогда не пытайтесь заблокировать форму, потому что мы не можем контролировать список отмены. - person chipbk10; 10.10.2014
comment
Ты прав. Я пробовал. Отмена выбора фигуры не сохраняется в стеке отмены. - person chipbk10; 13.10.2014

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

В качестве альтернативы, чтобы люди не делали подобных вещей (вы останавливаете только неопытных), вы также можете настроить их как мастер-слайды.

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

person ranieuwe    schedule 12.08.2013
comment
Поскольку ОП упомянул о желании заблокировать все фигуры, которые он / она создал программно, но не обязательно ВСЕ фигуры, трюки с прозрачным прямоугольником и изображением не обязательно будут работать. Но, как вы предполагаете, решительный идиот почти всегда может пересилить самое умное программное обеспечение. Как правило, цель должна состоять в том, чтобы облегчить пользователям выполнение того, что им нужно, а не пытаться помешать им делать то, что им не следует делать. - person Steve Rindsberg; 14.08.2013