共用方式為


Selection.BoundingBox 方法 (Visio)

會傳回一個矩形,此矩形會緊密圍住選取範圍的圖形。

語法

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

一個代表 選擇 物件的變數。

參數

名稱 必要/選用 資料類型 描述
Flags 必要 整數 旗標,會影響針對每一個造成結果邊界之圖形所計算的邊界。
左轉 必要 雙精確度 會傳回邊界左邊緣的 x 座標。
lpr8底部 必要 雙精確度 會傳回邊界下邊緣的 y 座標。
lpr8 對 必要 雙精確度 會傳回邊界右邊緣的 x 座標。
lpr8Top 必要 雙精確度 會傳回邊界上邊緣的 y 座標。

傳回值

註解

如果是 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 會傳回一個矩形,這個矩形是與圖形父系的本機座標系統平行的最小矩形 (此父系會圍住此圖形的文字)。
可見BBox範圍 &H4 會傳回一個矩形,這個矩形是與圖形父系的本機座標系統平行的最小矩形 (此父系會圍住此圖形的幾何所描繪的路徑)。 這可能會大於或小於圖形的直立寬度 - 高度方塊;針對類型為 visTypeForeignObject 的圖形所決定的範圍方塊會等於該圖形的直立寬度 - 高度方塊。
visBBoxIncludeHidden &H10 會包括隱藏的幾何。
visBBox忽略可見 &H20 會略過可見的幾何。
visBBoxIncludeDataGraphics &H10000 會包含套用到選取範圍中圖形的資料圖形註標圖形 (與其子圖形)。 預設為關閉。
visBBoxIncludeGuides &H1000 包含 visTypeGuide 型態的擴展範圍。 預設情況下, visTypeGuide 型態的形狀範圍會被忽略。如果你要求導軌範圍,只有垂直導軌的 x 位置和水平導軌的 y 位置會對回傳的矩形有貢獻。 若報告任何垂直導向,則返回無限大的 y 範圍。 若報告任何水平導向,則返回無限 x 範圍。 若報告任何旋轉的導向,則返回無限 xy 範圍。
visBBoxDrawingCoords &H2000 回傳正在考慮形狀的頁面或母版圖紙座標系中的數字。 根據預設,傳回的數字為所考量圖形之父系所屬本機座標系統中的繪圖單位。
可見BBoxNoNonPrint(可見BBox無印刷) &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 支援與意見反應