Shape.BoundingBox 方法 (Visio)

返回一个将形状密封在内的矩形。

语法

expressionBoundingBox( _Flags_ , _lpr8Left_ , _lpr8Bottom_ , _lpr8Right_ , _lpr8Top_ )

expression 一个代表 Shape 对象的变量。

参数

名称 必需/可选 数据类型 说明
Flags 必需 Integer 影响为各个形状计算的边框的标志,这些形状影响结果边框。
lpr8Left 必需 Double 返回边框左边缘的 x 轴坐标值。
lpr8Bottom 必需 Double 返回边框下边缘的 y 轴坐标值。
lpr8Right 必需 Double 返回边框右边缘的 x 轴坐标值。
lpr8Top 必需 Double 返回边框上边缘的 y 轴坐标值。

返回值

Nothing

注解

对于 Shape 对象,BoundingBox 方法返回一个将形状及其子形状紧密封闭在内的矩形。

对于 PageMasterSelection 对象,BoundingBox 方法返回一个矩形,该矩形将页面、主控形状或选定内容的形状及其子形状紧密封闭在内。

如果 BoundingBox 方法返回错误,或者如果要求返回包含零个形状的矩形,则返回的矩形为 { left: 0,bottom: 0,right: -1,top: -1 };否则,返回的矩形左小于或等于 (<= 右侧) ,底部小于或等于 (<=) 顶部。 返回的数字采用内部单位(英寸)。

为各个形状返回的矩形边框取决于该形状的 Type 属性。

常量 说明
visTypePage 等效于 Page.BoundingBoxMaster.BoundingBox
visTypeGroup 将组及其子形状紧密封闭在内的矩形。
visTypeShape 确定的矩形取决于标志。 请参阅下表。
visTypeForeignObject 确定的矩形取决于标志。 请参阅下表。
visTypeGuide 确定的矩形取决于标志。 请参阅下表。

对于对象类型 visTypeDoc,该方法会引发异常。

Flags 参数有几个位,用来控制对各个形状检索的边框。 如果设置了下表中描述的多个位,则为该形状确定的矩形将覆盖这些位隐含的所有矩形。

Flag 说明
visBBoxUprightWH &H1 返回一个矩形,该矩形是与形状的父级(包含形状的宽度-高度框)的本地坐标系平行的最小矩形。如果未旋转形状,则其垂直宽度高度框和宽度高度框相同。 形状几何图形中的路径不需要且通常不完全位于形状的宽度-高度框中。
visBBoxUprightText &H2 返回一个矩形,它是与将形状文本封闭在内的父形状所在的本地坐标系统平行的最小矩形。
visBBoxExtents &H4 返回一个矩形,该矩形是与形状的父级的本地坐标系平行的最小矩形,该坐标系包含形状的几何图形所绘制的路径。这可能大于或小于形状的直立宽度-高度框。 为 visTypeForeignObject 类型的形状确定的范围框等于该形状的垂直宽度高度框。
visBBoxIncludeHidden &H10 包括隐藏的几何图形。
visBBoxIgnoreVisible &H20 忽略可见的几何图形。
visBBoxIncludeDataGraphics &H10000 包括应用于形状的数据图形标注形状(及其子形状)。 默认情况下关闭。
visBBoxIncludeGuides &H1000 包括 visTypeguide 类型形状的盘区。 默认情况下, 将忽略 visTypeGuide 类型的形状范围。如果请求参考线范围,则只有垂直参考线的 x 位置和水平参考线的 y 位置会影响返回的矩形。 如果报告了任何垂直参考线,则会返回无限 y 范围。 如果报告了任何水平参考线,则返回无限 x 范围。 如果报告了任何旋转参考线,则会返回无限 xy 范围。
visBBoxDrawingCoords &H2000 返回正在考虑其形状的页面或主控形状的绘图坐标系统中的数字。 默认情况下,返回的数字采用所考虑形状的父形状的本地坐标系统中的绘图单位。
visBBoxNoNonPrint &H4000 忽略非打印形状的范围。 如果某一形状的 NonPrinting 单元格的值不为零或者该形状仅属于非打印图层,则它是非打印形状。

范围矩形是使用形状笔划的中心来确定的;它并不考虑笔划的宽度。 矩形也不包括任何由阴影或线端标记覆盖的区域。 Microsoft Visio 没有公布确定形状的“黑位”框(经调整以便将笔划宽度、阴影和线端包含在内的范围框)的方法。

形状可能有位于该形状报告的所有矩形边框之外的控制点或连接点。 通过查询形状单元格的结果,您可以确定控制点和连接点的位置。

示例

以下过程在“立即”窗口中打印所选形状的边框的大小。 如果在活动窗口中选择了多个形状,则会显示一个指示错误的消息框。 在所有情况下,报告的结果都以该形状所属的页面或主控形状的绘图单位表示。 这意味着如果该形状为某一组的子形状,则 visBBoxDrawingCoords 会作为一个标志传递给 BoundingBox 方法。

如果该形状是参考线,则该过程会将 visBBoxIncludeGuides 传递给 BoundingBox 方法,以便认为此形状有范围。 为该形状报告三个矩形:

  • visBBoxUprightWH :一个直立框,用于包围形状的宽度-高度框

  • visBBoxUprightText :一个包含形状文本框的直立框

  • visBBoxExtents :一个包含形状路径的直立框

要运行以下宏,请确保在 Visio 绘图页上只选择了一个形状。

 
Public Sub BoundingBox_Example() 
 
 Dim vsoSelection As Visio.Selection 
 Set vsoSelection = ActiveWindow.Selection 
 vsoSelection.IterationMode = visSelModeSkipSub 
 
 If vsoSelection.Count <> 1 Then 
 MsgBox "BoundingBox_Example() expects exactly one selected shape." 
 
 Else 
 
 Dim vsoShape As Visio.Shape 
 Set vsoShape = vsoSelection(1) 
 Dim intFlags As Integer 
 intFlags = 0 
 
 If vsoShape.ContainingShape.Type = visTypeGroup Then 
 
 intFlags = visBBoxDrawingCoords 
 
 End If 
 
 If vsoShape.Type = visTypeGuide Then 
 
 intFlags = intFlags + visBBoxIncludeGuides 
 
 End If 
 
 Dim dblTop As Double 
 Dim dblBottom As Double 
 Dim dblLeft As Double 
 Dim dblRight As Double 
 
 vsoShape.BoundingBox intFlags + visBBoxUprightWH, dblLeft, dblBottom, dblRight, dblTop 
 Debug.Print "Upright WH "; _ 
 "dblLeft:" & Application.FormatResult(dblLeft, "in", "", "#0.00 u"); _ 
 "dblBottom:" & Application.FormatResult(dblBottom, "in", "", "#0.00 u"); _ 
 "dblRight:" & Application.FormatResult(dblRight, "in", "", "#0.00 u"); _ 
 "dblTop:" & Application.FormatResult(dblTop, "in", "", "#0.00 u") 
 
 vsoShape.BoundingBox intFlags + visBBoxUprightText, dblLeft, dblBottom, dblRight, dblTop 
 Debug.Print "Upright text "; _ 
 "dblLeft:" & Application.FormatResult(dblLeft, "in", "", "#0.00 u"); _ 
 "dblBottom:" & Application.FormatResult(dblBottom, "in", "", "#0.00 u"); _ 
 "dblRight:" & Application.FormatResult(dblRight, "in", "", "#0.00 u"); _ 
 "dblTop:" & Application.FormatResult(dblTop, "in", "", "#0.00 u") 
 
 vsoShape.BoundingBox intFlags + visBBoxExtents, dblLeft, dblBottom, dblRight, dblTop 
 Debug.Print "Bounding Box "; _ 
 "dblLeft:" & Application.FormatResult(dblLeft, "in", "", "#0.00 u"); _ 
 "dblBottom:" & Application.FormatResult(dblBottom, "in", "", "#0.00 u"); _ 
 "dblRight:" & Application.FormatResult(dblRight, "in", "", "#0.00 u"); _ 
 "dblTop:" & Application.FormatResult(dblTop, "in", "", "#0.00 u") 
 
 End If 
 
End Sub

以下宏使用 BoundingBox 方法和 ShapesOverlap() 函数确定一个形状 (vsoShape2) 是否与另一形状 (vsoShape1) 重叠。

Public Sub OverlappingShapes_Example() 
 
 Dim vsoShape1 As Visio.Shape 
 Dim vsoShape2 As Visio.Shape 
 Dim blsIsOverlapping As Boolean 
 
 
 Set vsoShape1 = Application.ActiveWindow.Page.Drop(Application.Documents.Item("BASIC_U.VSS").Masters.ItemU("Square"), 3, 9) 
 
 Set vsoShape2 = Application.ActiveWindow.Page.Drop(Application.Documents.Item("BASIC_U.VSS").Masters.ItemU("Pentagon"), 3, 8) 
 
 blsIsOverlapping = ShapesOverlap(vsoShape2, vsoShape1) 
 
 If blsIsOverlapping Then 
 Debug.Print "Shapes overlap." 
 Else 
 Debug.Print "Shapes don't overlap." 
 End If 
 
End Sub 
 
 
Private Function ShapesOverlap(vsoShape1 As IVShape, vsoShape2 As IVShape) As Boolean 
 
 Dim dblLeft1 As Double 
 Dim dblLeft2 As Double 
 Dim dblBottom1 As Double 
 Dim dblBottom2 As Double 
 Dim dblRight1 As Double 
 Dim dblRight2 As Double 
 Dim dblTop1 As Double 
 Dim dblTop2 As Double 
 
 vsoShape1.BoundingBox Flags + visBBoxExtents, dblLeft1, dblBottom1, dblRight1, dblTop1 
 vsoShape2.BoundingBox Flags + visBBoxExtents, dblLeft2, dblBottom2, dblRight2, dblTop2 
 
 If ((dblLeft2 >= dblLeft1 And dblLeft2 <= dblRight1) Or _ 
 (dblRight2 >= dblLeft1 And dblRight2 <= dblRight1)) And _ 
 ((dblTop2 >= dblBottom1 And dblTop2 <= dblTop1) Or _ 
 (dblBottom2 >= dblBottom1 And dblBottom2 <= dblTop1)) Then 
 ShapesOverlap = True 
 Else 
 ShapesOverlap = False 
 End If 
 
End Function

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。