制作最顶层的形状
Posted
技术标签:
【中文标题】制作最顶层的形状【英文标题】:Making a Shape top-most 【发布时间】:2017-02-06 22:56:02 【问题描述】:在我的 Word 加载项中,我有一个 Word Document
对象,其中包含一个特定的 Section
。在这个Section
中,我附加了一个Shape
:
var shape = section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].Shapes.AddTextEffect(MsoPresetTextEffect.msoTextEffect1, "Example text...", "Calibri", 72, MsoTriState.msoFalse, MsoTriState.msoFalse, 0, 0, section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].Range) as Shape;
我的问题是某些 Word 文档模板的图像或其他内容出现在我的形状上方。最初,我认为设置 Z 顺序足以解决此问题:
shape.ZOrder(MsoZOrderCmd.msoBringToFront);
它没有。所以我的问题是,我怎样才能绝对设置我的Shape
的 Z 顺序,或者换句话说,我还需要做什么才能让我的Shape
成为最重要的事情您在文档中看到(意思是,它出现在所有其他事物之上)?
【问题讨论】:
【参考方案1】:我终于弄清楚了为什么这些方法不起作用:
shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);
shape.ZOrder(MsoZOrderCmd.msoBringToFront);
问题是我在HeaderFooter
部分中添加了我的Shape
对象,但在其顶部显示的形状是在Document
中定义的。 Z-ordering 仅与您的对象所在的同一部分中的其他形状相关(您的对象是否在实际文档中、页眉、页脚等中)。
因此,不要使用此代码将形状添加到特定部分:
var shape = section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].Shapes.AddTextEffect(MsoPresetTextEffect.msoTextEffect1, "Example text...", "Calibri", 72, MsoTriState.msoFalse, MsoTriState.msoFalse, 0, 0, section.Headers[WdHeaderFooterIndex.wdHeaderFooterFirstPage].Range) as Shape;
shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);
shape.ZOrder(MsoZOrderCmd.msoBringToFront);
我使用此代码将其直接添加到我的文档中,然后对其应用 Z 排序,它确实有效。它出现在我模板中的所有其他对象之上:
var shape = document.Shapes.AddTextEffect(MsoPresetTextEffect.msoTextEffect1, "Example text...", "Calibri", 72, MsoTriState.msoFalse, MsoTriState.msoFalse, 0, 0) as Shape;
shape.ZOrder(MsoZOrderCmd.msoBringToFront);
Writing Word Macros, Second Edition 非常清楚地说明了这一点:
ZOrder 方法设置 Shape 对象相对于其他对象的 z 顺序 对象。请注意,该方法不设置绝对 z 顺序。
因此,绝对 Z 顺序取决于其他因素,例如在这种情况下 Shape
的实际位置。
【讨论】:
【参考方案2】:在 Word 中手动执行此操作,我选择了“在文本前面显示”选项。你应该试试:
shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);
如果由于其他对象而仅此一项不起作用,请尝试一个接一个地使用:
shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);
shape.ZOrder(MsoZOrderCmd.msoBringToFront);
这样做的原因是 MS Word 似乎将 Text 和其他对象视为具有不同的 Z-Orders。
【讨论】:
我也会这么说,即使在诸如以下的规范书籍中,作者也明确说明了 ZOrder 方法如何设置 Shape 对象相对于其他对象的 z 顺序。请注意,该方法没有设置绝对 z 顺序。:safaribooksonline.com/library/view/writing-word-macros/…您的答案不起作用,也不是规范答案。 @Alexandru 也许您的链接实际上回答了您的问题,因为如果没有多个对象成为 Z 顺序的一部分,Z 顺序就毫无意义。除非您的形状是最后一个接收 Z 顺序命令的形状,否则互操作中似乎没有任何方法可以覆盖它。毫无疑问,这是设计使然。祝您找到规范的答案好运,因为您自己的链接显示的内容与您想要的不同。 此声明纯粹是您对我链接的 sn-p 的解释: 除非您的形状是最后一个接收 Z 顺序命令的形状,否则似乎没有任何内置方法到互操作来覆盖它。它在sn-p中没有任何地方说这个。它确实暗示它不会设置绝对 Z 顺序,并且确实说它相对于其他对象起作用。它暗示这一点是有原因的,我想知道这是什么原因,但相信我,这不是你对它可能的插值。绝对模板会引入出现在我之上的对象。请尊重这个问题。 @Alexandru 不言而喻,设置一个Shape对象相对于其他对象的z-order意味着最后一个z-order集优先。该链接并未暗示您可以以任何其他方式进行操作 - 相反,它表示您不能以任何其他方式设置 z-order。请注意z 顺序只能通过以下方式设置:我试图成为帮助 - 但您似乎对帮助不太感兴趣。 这确实意味着最后一个 Z 顺序集具有优先权,但显然,我们只是尝试使用您的shape.ZOrder(MsoZOrderCmd.msoBringInFrontOfText);
和 shape.ZOrder(MsoZOrderCmd.msoBringToFront);
的建议设置最后一个 Z 顺序,我们发现确实如此什么都不做。所以,我认为这里缺少的东西与形状的相对性有关。例如,某些形状可能位于不同的部分。那么如何为它们设置 Z 排序呢?以上是关于制作最顶层的形状的主要内容,如果未能解决你的问题,请参考以下文章