Word VSTO - 在文档中查找形状的位置?

Word VSTO - Finding the location of a shape in the document?

我正在构建一个 Word VSTO (VB.NET) 程序,我需要在其中从顶部、左侧、右侧和底部找到形状的精确位置。我使用下面的代码,

objShape = Globals.ThisAddIn.Application.ActiveDocument.Shapes(intShapesLoop)

objShape.RelativeHorizontalPosition = Word.WdRelativeHorizontalPosition.wdRelativeHorizontalPositionMargin

objShape.Select()

sngPageWidth = Globals.ThisAddIn.Application.Selection.Range.PageSetup.PageWidth
sngPageHeight = Globals.ThisAddIn.Application.Selection.Range.PageSetup.PageHeight

sngMarginsLeft = objShape.Left + Globals.ThisAddIn.Application.Selection.Range.PageSetup.LeftMargin
sngMarginsRight = sngPageWidth - (objShape.Width + sngMarginsLeft + sngGutterPosistionRight)

这很好用,并显示了左和右的正确位置值。但是,我将以下代码用于顶部和底部位置,

sngMarginsTop = objShape.Top + Globals.ThisAddIn.Application.Selection.Range.PageSetup.TopMargin
sngMarginsBottom = sngPageHeight - (objShape.Height + sngMarginsTop)

这显示了错误的位置值。这里的问题是什么?从 Top 值来看,它显示比正确值少大约 12 个点

我发现这种情况只发生在少数文档上。它在大多数文档中显示正确的 Top 值,但在少数文档中显示错误的 Top 值。

这就是top值错误的原因,

在“高级布局”对话框中(文本环绕 > 更多布局选项...),

红色矩形标记的组合框必须设置为边距。 top 值错误的原因是因为 Absolute position ... below 设置为 Paragraph 而不是 Margin。当它设置为 Margin 时,最高值变得正确。