按指定的值将形状定位到 Chart 的坐标轴中


        ''' <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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值