0%

CSharp 制作一个可以旋转的饼型图

  • 来源:明日科技
  • 制作一个可以旋转的饼型图

    实例说明

    通过本实例绘制的饼型图可以直观的显示公司员工的性别比例,而且还可以通过单击“旋转”按钮使饼型图旋转起来。
    实例运行效果如图1所示。
    图1 制作一个可以旋转的饼型图

    关键技术

    本实例在实现时,首先通过Graphics类的FillEllipse方法和FillPie方法绘制饼型图,然后通过使用Timer组件控制饼型图的旋转。
    下面对本实例中用到的关键技术进行详细讲解。
    Timer组件表示一个计时器,它可以按用户定义的时间间隔来引发事件,引发的事件一般为周期性的,每隔若干秒或若干毫秒执行一次,其常用的属性、方法及事件如表1所示。
    表1 Timer组件的常用属性、方法及事件

    属性、方法及事件 说明
    Enabled属性 获取或设置计时器是否正在运行
    Interval属性 获取或设置在相对于上一次发生的Tick事件引发Tick事件之前的时间(以毫秒为单位)
    Start方法 启动计时器
    Stop方法 停止计时器
    Tick事件 当指定的计时器间隔已过去而且计时器处于启用状态时发生

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为RoundCaky。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加两个Panel控件,分别用来显示表示男女比例的饼型图和说明信息;添加两个Button控件,分别用来执行绘制饼型图和旋转饼型图操作;添加一个Timer组件,用来控制饼型图的旋转与停止。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    private void ShowPic(string SexCode, float f)// ShowPic方法用来绘制饼图
    {
    this.Controls.Add(panel1);//将Panel控件添加到窗体中
    panel1.Width = 230;//设置Panel控件的宽度
    panel1.Height = 230;//设置Panel控件的高度
    bt = new Bitmap(panel1.Width, panel1.Height);//创建画布
    Graphics g = Graphics.FromImage(bt);//创建Graphics对象
    Pen p = new Pen(new SolidBrush(Color.Blue));//创建画笔
    Point p1 = new Point(0, 0);//创建一个Point对象
    Size s = new Size(this.panel1.Width, this.panel1.Height);//创建Size对象
    Rectangle trct = new Rectangle(p1, s);//创建Rectangle对象
    g.FillEllipse(new SolidBrush(Color.Red), trct);//绘制椭圆
    g.FillPie(new SolidBrush(Color.Blue), trct, flag, f * 360);//绘制扇形
    bt1 = new Bitmap(panel2.Width, panel2.Height);//创建画布
    Graphics ginfo = Graphics.FromImage(bt1);//创建Graphics对象
    Font font = new Font("宋体", 10, FontStyle.Regular);//设置字体
    ginfo.DrawString(SexCode + " " + f.ToString().Substring(0, 4), font, new SolidBrush(Color.Blue), 0, 5);
    ginfo.DrawString("女" + " " + (1.0 - Convert.ToDouble(f.ToString().Substring(0, 4))).ToString().Substring(0, 4), font, new SolidBrush(Color.Red), 0, 25); //绘制性别及比率
    panel1.BackgroundImage = bt;//显示饼图
    panel2.BackgroundImage = bt1;//显示性别及比率
    }
    private void button1_Click(object sender, EventArgs e)//单击“显示”按钮显示饼图
    {
    Conn();//连接数据库
    using (cmd = new SqlCommand("SELECT sex,COUNT(sex) num FROM tb_sex group by sex", con))
    {
    SqlDataReader dr = cmd.ExecuteReader();//创建SqlDataReader对象
    string[] str = new string[2];
    int i = 0;
    while (dr.Read())//读取记录
    {
    str[i] = dr[0].ToString() + "," + dr[1].ToString();//获取数据库中存储的性别及比例
    i++;
    }
    float N = Convert.ToInt16(str[0].Substring(2)) + Convert.ToInt16(str[1].Substring(2)); //男女性别比例之和
    float f = Convert.ToInt16(str[0].Substring(2)) / N;//男性的比例
    flag = 180;//开始绘制的起始角度
    ShowPic(str[0].Substring(0, 1), f);//调用ShowPic方法绘制饼图
    }
    con.Close();
    }
    private void timer1_Tick(object sender, EventArgs e)//当单击“旋转”按钮时开始旋转饼图
    {
    flag += 1;//每次转动一度
    Conn();//连接数据库
    using (cmd = new SqlCommand("SELECT sex,COUNT(sex) num FROM tb_sex group by sex", con))
    {
    SqlDataReader dr = cmd.ExecuteReader();//创建SqlDataReader对象
    string[] str = new string[2];//声明数组存储性别及比例
    int i = 0;
    while (dr.Read())
    {
    str[i] = dr[0].ToString() + "," + dr[1].ToString();//获取数据库中存储的性别及比例
    i++;
    }
    float N = Convert.ToInt16(str[0].Substring(2)) + Convert.ToInt16(str[1].Substring(2)); //男女性别比例之和
    float f = Convert.ToInt16(str[0].Substring(2)) / N;//男性的比例
    ShowPic(str[0].Substring(0, 1), f);//调用ShowPic方法绘制饼图
    }
    con.Close();//关闭连接
    }
    private void button2_Click(object sender, EventArgs e)//“旋转”按钮
    {
    if (button2.Text == "旋转")//如果按钮显示“旋转”文本
    {
    timer1.Start();//开始Timer控件
    button2.Text = "停止";//将按钮的文本设为“停止”
    }
    else//如果按钮的文本为“停止”
    {
    timer1.Stop();//停止Timer控件
    button2.Text = "旋转";//将按钮的文本设为“旋转”
    }
    }

    秘笈心法

    心法领悟016:Timer计时器组件的使用。
    Timer组件是一个计时器组件,它主要用来按用户定义的时间间隔来引发事件,引发的事件一般为周期性的,每隔若干秒或若干毫秒执行一次。

    觉得文章有用?请我喝杯咖啡~