''' <summary>
''' 将任意形状以指定的值定位在Chart的某一坐标轴中。
''' </summary>
''' <param name="ShapeToLocate">要进行定位的形状</param>
''' <param name="Ax">此形状将要定位的轴</param>
''' <param name="Value">此形状在Chart中所处的值</param>
''' <param name="percent">将形状按指定的百分比的宽度或者高度的部位定位到坐标轴的指定值的位置。
''' 如果其值设定为0,则表示此形状的左端(或上端)定位在设定的位置处,
''' 如果其值为100,则表示此形状的右端(或下端)定位在设置的位置处。</param>
''' <remarks></remarks>
Public Shared Sub setPositionInChart(ByVal ShapeToLocate As Excel.Shape, ByVal Ax As Excel.Axis, _
ByVal Value As Double, Optional ByVal percent As Double = 0)
Dim cht As Excel.Chart = DirectCast(Ax.Parent, Excel.Chart)
If cht IsNot Nothing Then
Try '先考察形状是否是在Chart之中
ShapeToLocate = cht.Shapes.Item(ShapeToLocate.Name)
Catch ex As Exception '如果形状不在Chart中,则将形状复制进Chart,并将原形状删除
ShapeToLocate.Copy()
cht.Paste()
ShapeToLocate.Delete()
ShapeToLocate = cht.Shapes.Item(cht.Shapes.Count)
End Try
'
Select Case Ax.Type
Case Excel.XlAxisType.xlCategory '横向X轴
Dim PositionInChartByValue As Double = GetPositionInChartByValue(Ax, Value)
With ShapeToLocate
.Left = PositionInChartByValue - percent * .Width
End With
Case Excel.XlAxisType.xlValue '竖向Y轴
Dim PositionInChartByValue As Double = GetPositionInChartByValue(Ax, Value)
With ShapeToLocate
.Top = PositionInChartByValue - percent * .Height
End With
Case Excel.XlAxisType.xlSeriesAxis
MessageBox.Show("暂时不知道这是什么坐标轴", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Select
End If
End Sub
''' <summary>
''' 根据在坐标轴中的值,来返回这个值在Chart中的几何位置
''' </summary>
''' <param name="Ax"></param>
''' <param name="Value"></param>
''' <returns>如果Ax是一个水平X轴,则返回的是坐标轴Ax中的值Value在Chart中的Left值;
''' 如果Ax是一个竖向Y轴,则返回的是坐标轴Ax中的值Value在Chart中的Top值。</returns>
''' <remarks></remarks>
Public Shared Function GetPositionInChartByValue(ByVal Ax As Excel.Axis, ByVal Value As Double) As Double
Dim PositionInChartByValue As Double
Dim cht As Excel.Chart = DirectCast(Ax.Parent, Excel.Chart)
'
Dim max As Double = Ax.MaximumScale
Dim min As Double = Ax.MinimumScale
'
Dim PlotA As Excel.PlotArea = cht.PlotArea
Select Case Ax.Type
Case Excel.XlAxisType.xlCategory '横向X轴
Dim PositionInPlot As Double
If Ax.ReversePlotOrder = False Then '正向分类,说明X轴数据为左边小右边大
PositionInPlot = PlotA.InsideWidth * (Value - min) / (max - min)
Else '逆序类别,说明X轴数据为左边大右边小
PositionInPlot = PlotA.InsideWidth * (max - Value) / (max - min)
End If
PositionInChartByValue = PlotA.InsideLeft + PositionInPlot
Case Excel.XlAxisType.xlValue '竖向Y轴
Dim PositionInPlot As Double
If Ax.ReversePlotOrder = False Then '顺序刻度值,说明Y轴数据为下边小上边大
PositionInPlot = PlotA.InsideHeight * (max - Value) / (max - min)
Else '逆序刻度值,说明Y轴数据为上边小下边大
PositionInPlot = PlotA.InsideHeight * (Value - min) / (max - min)
End If
PositionInChartByValue = PlotA.InsideTop + PositionInPlot
Case Excel.XlAxisType.xlSeriesAxis
Debug.Print("暂时不知道这是什么坐标轴")
End Select
Return PositionInChartByValue
End Function