使用GDI+画2D饼状图(VB.Net)

原创 2007年09月30日 13:42:00
很久没写过本机windows App了,群内有人要实现花饼图的代码,而且不能用水晶报表,恰逢10.1,自己写了个实现。

新建一个windows app工程,在窗体上填加一个picturebox(picshow)和三个label(lblrectA,B,C)
在窗体代码页中他填加下面的代码:

Public Class Form1

    '/*************************design by 撒卡*************************/
    '/功能:使用GDI画饼图demo
    '/时间:07.09.30
    '/****************************************************************/

    Private Const Pi As Single = 3.1415926

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With PicShow
            '.Top = 10
            '.Left = 10
            '.Width = 300
            '.Height = 300
            .Dock = DockStyle.Fill
        End With
        Me.Controls.Add(PicShow)
    End Sub

    Private Sub Mypaint(ByVal e As PaintEventArgs)

        Dim MyCircle As Graphics = e.Graphics
        Dim Myline As Graphics = e.Graphics
        Dim MyPen As New Pen(Color.Black)
        Dim myRect As New Rectangle(50, 50, 200, 200)
        'MyCircle.DrawEllipse(MyPen, myRect)  '边框,被覆盖
        Myline.DrawLine(MyPen, 50, 150, 150, 150)

        '划分区间
        Dim sRectPer(2) As Single, x1(2) As Single, y1(2) As Single '定义的数组数为区间数-1
        sRectPer(0) = Radian("30", "30", "30", "40")
        x1(0) = 150 - Math.Cos(sRectPer(0)) * 100 '半径为100
        y1(0) = 150 - Math.Sin(sRectPer(0)) * 100
        Myline.DrawLine(MyPen, x1(0), y1(0), 150, 150)

        sRectPer(1) = Radian("60", "30", "30", "40") 'srectPer(n)的radian函数的第一个参数为前n+1个参数的和
        x1(1) = 150 - Math.Cos(sRectPer(1)) * 100
        y1(1) = 150 - Math.Sin(sRectPer(1)) * 100
        Myline.DrawLine(MyPen, x1(1), y1(1), 150, 150)

        '填充区间
        Dim x2(3) As Single, y2(3) As Single   '数组大小等于区间数
        For i As Double = 0 To sRectPer(0) Step 0.0001
            x2(0) = 150 - Math.Cos(i) * 100
            y2(0) = 150 - Math.Sin(i) * 100
            Myline.DrawLine(Pens.Magenta, x2(0), y2(0), 150, 150)
        Next

        For j As Double = sRectPer(0) To sRectPer(1) Step 0.0001
            x2(1) = 150 - Math.Cos(j) * 100
            y2(1) = 150 - Math.Sin(j) * 100
            Myline.DrawLine(Pens.SeaGreen, x2(1), y2(1), 150, 150)
        Next
        Dim newline As Graphics = e.Graphics
        For k As Double = sRectPer(1) To Pi * 2 Step 0.0001
            x2(2) = 150 - Math.Cos(k) * 100
            y2(2) = 150 - Math.Sin(k) * 100
            newline.DrawLine(Pens.Orange, x2(2), y2(2), 150, 150)
        Next
        'Dim a As Single = percentage("30", "30", "30", "40")
        'Debug.Print(a.ToString)

        '标示区间
        With lblrectA
            .Top = (150 + y1(0)) * 0.5
            .Left = (50 + x1(0)) * 0.3
            .Text = "组分A比例:" & percentage("30", "30", "30", "40")
            .BackColor = Color.Magenta
            .ForeColor = Color.White
        End With
        With lblrectB
            .Top = (y1(0) + y1(1)) * 0.5
            .Left = (x1(0) + x1(1)) * 0.4
            .Text = "组分B比例:" & percentage("30", "30", "30", "40")
            .BackColor = Color.SeaGreen
            .ForeColor = Color.White
        End With
        With lblrectC
            .Top = (150 + y1(1)) * 0.5
            .Left = (50 + x1(1)) * 0.3
            .Text = "组分C比例:" & percentage("40", "30", "30", "40")
            .BackColor = Color.Orange
            .ForeColor = Color.White
        End With

        MyPen.Dispose()
    End Sub

    Private Sub PicShow_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PicShow.Paint
        Mypaint(e)
    End Sub

    Private Function percentage(ByVal rect As Integer, ByVal ParamArray rectall() As Integer) As Single
        Dim sum As Int64
        For i As Integer = 0 To UBound(rectall, 1)
            sum += rectall(i)
        Next
        percentage = rect / sum
    End Function

    Private Function Radian(ByVal rect As Integer, ByVal ParamArray rectall() As Integer) As Double
        radian = percentage(rect, rectall) * Pi * 2
    End Function
End Class


函数过程并没有进行优化,很多代码还是可以抽象出函数过程的,比如填充部分.如果你在自己项目中有应用,那你自己修改吧~当然也可以设计成一个class,时间原因,我没有那么做,你可以试下,很简单的东西,不多说了。帖个效果图

使用VB.Net GDI+编程编写的3D魔方游戏程序

最近学习了.net下的GDI+编程,下面小秀一下成果,使用GDI+编写的桌面魔方程序,今天把源代码放上,欢迎大家下载,如果机器上有.net环境的话可以直接运行bin目录下的MagicCube.exe进...
  • yctccg
  • yctccg
  • 2016年08月16日 10:40
  • 269

vb.net GDI+入门——使用Graphics对象绘制线图

在实际应用中,很多图形是由点和线构成的,vb.net的Graphics 类提供了很多画线图的方法,我们可以使用这些重载了的方法组合出丰富的图案来。 下面我们就来了解下这些绘线图的方法。 一、Dra...

vb.net GDI+入门——使用Graphics对象填充图形

上一章我们了解如何使用Graphics对象来绘制由点和线构成的线图《vb.net GDI+入门——使用Graphics对象绘制线图》,在实际绘图中,我们还需要使用色块等来填充图形,这一章, 就来看如...

vb.net GDI+入门——使用DrawString显示文本

在GDI+ 中,我们是使用Graphics 的 DrawString 方法来在对象的表面绘制文本,其它还需要用到FontFamliy、Font、StringFormat等类来控制文本的特征。在前面我们...

[vb.net]使用GDI+绘图达到图片随鼠标缩放与移动的效果

[vb.net]使用GDI+绘图达到图片随鼠标缩放与移动的效果近日需要在软件中加入对图片的浏览功能,类似地图的拖拽及缩放操作。 网上大部分教程写的不够详细,对于初学者来讲不易理解。总结下要点,有二: ...

vb.net GDI+入门——创建 Graphics 对象

我们用GDI+创建绘图,必须先创建Graphics对象,然后才可以使用GDI+的笔、刷等结合Color、Font等对象进行绘制线条形状、填充区域、显示文本图像等操作。Graphices 对象表示GDI...

vb.net GDI+入门——了解Font类

Font类用于指定文本格式,就像我们在其它应用程序中设置字体、字号等。 Font的构造函数语法为: Public sub New (byval prototype As Font,byval ne...

vb.net GDI+入门——画笔、画刷和颜色

GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。顾名思义,GDI+就是GDI...

VB.NET GDI+ 天气预报

最近闲来无事,想起天气预报那个工具很不好用,所以想自己做一个。 于是顺便体验下WPF的魅力,就用WPF开始动工了。进度很快,技术上不是很难摸, 一天吧就完成了决大部分主要功能 。其实就是一个显示界...

C# 使用GDI+绘制柱状图

  • 2013年09月14日 01:42
  • 49KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用GDI+画2D饼状图(VB.Net)
举报原因:
原因补充:

(最多只允许输入30个字)