65.9K
CodeProject 正在变化。 阅读更多。
Home

绘制条形图

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.93/5 (26投票s)

2004 年 6 月 18 日

1分钟阅读

viewsIcon

145574

downloadIcon

1183

这篇文章是关于绘制给定值集的条形图的。

Sample Image - DrawBarChart.gif

引言

这篇文章描述了一个在窗体中绘制条形图的程序,具有所有功能。使用此过程,可以通过设置 X 轴和 Y 轴在窗体中绘制任意数量的图表。

输入参数

  • objEnum As IDictionaryEnumerator - 用于绘制图表的数据。
  • intItemCount As Integer - 要在图表中显示的项目的数量(您可以从 DictionaryEnumerator 本身获取)。
  • strGraphTitle As String - 要为图表绘制的标题。
  • Xaxis As Integer - 起始 X 轴。
  • Yaxis As Integer - 起始 Y 轴。
  • MaxWidth As Int16 - 图表的最大宽度(用于计算)。
  • MaxHt As Int16 - 图表的最大高度(用于计算)。
  • clearForm As Boolean - 是否需要清除 Form
  • Optional ByVal SpaceRequired As Boolean - 两个图表之间是否需要空格。

该图表必须在 FormPaint 事件中调用,并且参数应该在 FormResize 事件中调整大小。

LoadColorArray 过程用于获得绘制图表所需的颜色。因为,如果我们使用 RGB,总的来说,图表看起来不会很好。

当您需要在同一个 Form 中显示 2 个图表时,可以使用参数 clearForm;在这种情况下它会很有用...

Public Sub drawBarChart(ByVal objEnum As IDictionaryEnumerator, _
          ByVal intItemCount As Integer, ByVal strGraphTitle As String, _
          ByVal Xaxis As Integer, ByVal Yaxis As Integer, _
          ByVal MaxWidth As Int16, ByVal MaxHt As Int16, _
          ByVal clearForm As Boolean, _
          Optional ByVal SpaceRequired As Boolean = False)

    Dim intGraphXaxis As Integer = Xaxis
    Dim intGraphYaxis As Integer = Yaxis
    Dim intWidthMax As Integer = MaxWidth
    Dim intHeightMax As Integer = MaxHt
    Dim intSpaceHeight As Integer
    Dim intMaxValue As Integer = 0
    Dim intCounter As Integer
    Dim intBarWidthMax
    Dim intBarHeight
    Dim strText As String
    Try
        Dim grfx As Graphics = CreateGraphics()
        If clearForm = True Then
            grfx.Clear(BackColor)
        End If

        grfx.DrawString(strGraphTitle, New Font("VERDANA", 12.0, _
          FontStyle.Bold, GraphicsUnit.Point), _
          Brushes.DeepPink, intGraphXaxis + (intWidthMax / 4), _
          (intGraphYaxis - intHeightMax) - 40)

        'Get the Height of the Bar        
        intBarHeight = CInt(intHeightMax / intItemCount)

        'Get the space Height of the Bar 
        intSpaceHeight = _
          CInt((intHeightMax / (intItemCount - 1)) - intBarHeight)

        'Find Maximum of the input value
        If Not objEnum Is Nothing Then
            While objEnum.MoveNext = True
                If objEnum.Value > intMaxValue Then
                    intMaxValue = objEnum.Value
                End If
            End While
        End If

        'Get the Maximum Width of the Bar
        intBarWidthMax = CInt(intWidthMax / intMaxValue)

        ' Obtain the Graphics object exposed by the Form.

        If Not objEnum Is Nothing Then
            intCounter = 1
            objEnum.Reset()
            'Draw X axis and Y axis lines
            grfx.DrawLine(Pens.Black, intGraphXaxis, _
              intGraphYaxis, intGraphXaxis + intWidthMax, _
              intGraphYaxis)
            grfx.DrawLine(Pens.Black, intGraphXaxis, _
              intGraphYaxis, intGraphXaxis, _
              (intGraphYaxis - intHeightMax) - 25)

            While objEnum.MoveNext = True
                'Get new Y axis
                intGraphYaxis = intGraphYaxis - intBarHeight
                'Draw Rectangle
                grfx.DrawRectangle(Pens.Black, _
                  New Rectangle(intGraphXaxis, intGraphYaxis, _
                  intBarWidthMax * objEnum.Value, intBarHeight))
                'Fill Rectangle
                grfx.FillRectangle(objColorArray(intCounter), _
                  New Rectangle(intGraphXaxis, intGraphYaxis, _
                  intBarWidthMax * objEnum.Value, intBarHeight))
                'Display Text and value
                strText = "(" & objEnum.Key & "," & objEnum.Value & ")"
                grfx.DrawString(strText, New Font("VERDANA", 8.0, _
                  FontStyle.Regular, GraphicsUnit.Point), _
                  Brushes.Black, intGraphXaxis + _
                  (intBarWidthMax * objEnum.Value), intGraphYaxis)
                intCounter += 1
                If SpaceRequired = True Then
                    intGraphYaxis = intGraphYaxis - intSpaceHeight
                End If
                If intCounter > objColorArray.GetUpperBound(0) Then
                    intCounter = 1
                End If
            End While
            If clearForm = True Then
                grfx.Dispose()
            End If
        End If
    Catch ex As Exception
        Throw ex
    End Try
End Sub

该过程的优点

我们可以在一个窗体中拥有任意数量的图表,并且可以在运行时更改图表的设置。 使用 LoadColorArrays 过程(此处未粘贴。但可在演示项目中找到),我们可以在图表中提供良好的颜色,这将非常吸引用户。

© . All rights reserved.