是否可以跟踪powerpoint插件中的形状变化?

时间:2012-12-05 12:45:11

标签: c# powerpoint office-addins

目前在我的ppt addin项目中,我想知道是否可以跟踪用户所做的形状更改:

  • 文本框A移至(210,100)
  • 文本框B将字体更改为Calibri
  • 文本框B将样式更改为下划线
  • 删除文字框C
  • 添加图片A
  • 将图像A调整为320x240
  • ...

我对PPT 2013的了解有一个AfterShapeSizeChange事件,因此您可以在重新调整大小后知道,但我需要更多,这是用户所做的所有可能的更改。

在尝试通过浏览找到之后,这里有一些可能性:

  1. 使用SelectionChanged事件创建我自己的日志跟踪,但如果用户按 CTRL + Z CTRL + ,这将会非常棘手是
  2. 查看撤消/重做堆栈(人们说这是不可能的......)

3 个答案:

答案 0 :(得分:0)

您是否需要实际跟踪更改,还是需要能够检测到已进行更改?即,给定的形状与原始形状不完全相同。

如果是后者,那怎么样:

编写一个例程,“触摸”演示文稿中的每个形状,并为其添加标签,每个属性的一个标签,您希望能够检测到更改。

然后你需要做的就是查看每个形状的标签,看看那里存储的属性是否与形状的当前属性相匹配。

例如,要标记形状:

For each oSl in ActivePresentation.Slides
  For each oSh in oSl.Shapes
    oSh.Tags.Add "Left", cstr(oSh.Left)
    oSh.Tags.Add "Top", cstr(oSh.Top)
  Next
Next

答案 1 :(得分:0)

我遇到了同样的问题。

让我说,我认为最好的解决方案是将形状序列化为XML(形状状态)并将其保存为自己的形状。这样,下次访问形状时,可以使用序列化状态检查当前状态。

可以将XML保存在一个形状中,但是你不能在“一个命令”中序列化COM形状,你已经实现了你自己的序列化查找所有形状属性(我认为!!!!)。

我的解决方法是:每次用户在幻灯片中放置一个形状(比如ShapeA),在特定母版页(ShapeA_state1)中创建一个形状副本,新形状保持我的ShapeA状态。然后我将ShapeA_state1的引用保存到ShapeA中。通过这种方式,当应用程序第二次访问ShapeA时,应用程序可以检查状态是否已更改,并查看引用的ShapeA_state1。发生这种情况时,ShapeA.1将更新为ShapeA_edited

答案 2 :(得分:0)

解决此问题的另一种方法是向监控Application.ActivePresentation.Saved的程序添加一个线程 - 如果它设置为false,您知道已经进行了更改并且可以查看所选对象或幻灯片 - 当然您需要添加一个图层来重置Saved标志 - 并在保存之前将其传回。

访问撤消信息我没有成功。

我在PPT之前添加鼠标钩子和拦截按钮取得了很好的成功 - 非常适合拦截Application_SlideShowBegin之前的PlaySlideShow按钮和在Application_SlideShowNext *事件之前播放期间的Next / Prev幻灯片。

当您想要拦截按钮位置的位置时,请记住PresenterMode和DPI比例变化等事项。