【发布时间】:2021-06-19 03:30:45
【问题描述】:
我在 Word 2010 中渲染 3D 形状,由于我的文档有几个动画图表,我决定将这些形状移动到绘图画布上,每个动画一个。为此,我修改了代码以支持 Shapes 和 CanvasShapes。我已经解决了大多数问题,除了一个问题:Z-Order 方法不会改变 CanvasShapes 的 Z-order 定位。
我一直在互联网上搜索原因,但找不到任何原因。仅使用“ZOrder”和“CanvasShape”这两个搜索词并没有太多意义。我确实找到了 CanvasShape 的 MSDN 类描述,它没有将“Zorder”列为类成员,但是 Zorder 的使用信息将“CanvasShape”列为“支持的类”。如果该方法不改变 z 顺序位置,这意味着什么?
少量的点击让我相信我在做一些完全不合常规的事情或/并且我错过了一些非常基本的事情。
以下是我的测试例程:
Sub Test()
With ActiveDocument.Shapes.AddCanvas(72, 72, 144, 144)
.Name = "Test Canvas"
.CanvasItems.AddShape(msoShapeRectangle, 0, 0, 36, 36).Name = "Shape 1"
With .CanvasItems.AddShape(msoShapeRectangle, 0, 0, 36, 36)
.Name = "Shape 2"
Debug.Print .ZOrderPosition
.ZOrder msoSendToBack
Debug.Print .ZOrderPosition
End With
End With
End Sub
在 Word VBE 中执行时,将使用两个画布项将绘图画布添加到活动文档中。这个宏会尝试切换两者的 Z 顺序定位。第二个画布形状的 z 顺序位置将在切换尝试之前和之后打印在立即/调试窗口中。如果 zorder 方法正常运行,则之前和之后的值应该不同。在我的系统上,不是因为 zorderposition 没有改变。我还注意到我没有收到错误消息或任何类型的停止。这就是 MSDN 所说的“支持的类”吗?
作为一种解决方法,我考虑剪切 CanvasShapes,然后以正确的 Z 顺序将它们粘贴回画布上,不幸的是,这种方法会破坏我分配的时间片。通过 Word GUI 手动“向前”和“向后发送”的过程仍然适用于这两个类,我将如何模仿?
【问题讨论】:
-
尝试在您的
.ZOrder msoSendToBack行之后调用DoEvents。 (docs.microsoft.com/en-us/office/vba/language/reference/…) -
我尝试使用 DoEvents 进行更改;它对在我的 Word/MSOffice 2010 设置中切换 z 顺序位置没有影响。
标签: vba ms-word shapes z-order