4

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

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

我所知道的 PPT 2013 有一个AfterShapeSizeChange事件,所以你可以在重新调整大小后知道,但我需要的不止这些,这是用户所做的所有可能的更改。

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

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

3 回答 3

0

我有同样的问题。

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

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

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

于 2013-04-04T15:12:25.553 回答
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
于 2012-12-05T16:40:52.607 回答
0

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

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

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

在确定您希望拦截的按钮位置时,请记住诸如 PresenterMode 和 DPI 比例变化之类的事情。

于 2016-07-21T22:24:39.293 回答