zoukankan      html  css  js  c++  java
  • C# — WinForm 饼形图之插入介绍文字

    由于项目的原因,需要在WinForm上做出一个饼形统计图的展示效果。相关数据是动态从数据库中获取,相应所占圆的角度计算都不是难点,可以很快地做出一个饼形统计图。

    但难点在于如何将一些介绍文字插入到相应的弧度上。

    实现的效果如下图所示:

    相应的代码如下:

            /*3个参数
         type:是指需要写柱形图,还是饼形图,后面有个相应的判断
         StartTime:是指统计开始时间
         EndTime:是指统计结束时间 */
    private void Create_Chart(string type, DateTime StartTime, DateTime EndTime) { /*定义3个动态数组,分别储存选项,选项对应数量,选项对应百分比,选项对应的饼图角度,选项累积的总数*/ ArrayList arraylist_type = new ArrayList(); ArrayList arraylist_count = new ArrayList(); ArrayList arraylist_tp = new ArrayList(); ArrayList arraylist_angle = new ArrayList(); /*定义2个int变量,分别储存统计总量,统计的总行数*/ int sum = 0; int resultCount = 0; /*取数据库中的选项,对应数量
         在这里,我采用的Linq 取数据库中的数据,大家如果采用SQL语句的话,直接从数据库操作层返回一个DataSet就可以了,方式类似*/ using (BLLUser a = new BLLUser()) { IList<Unit.HandleCountClass> result = a.Statistics_Handle(type, StartTime, EndTime); resultCount = result.Count; foreach (var item in result) { arraylist_type.Add(item.type.ToString()); arraylist_count.Add(Convert.ToInt32(item.Handlecount)); sum = sum + item.Handlecount; } } //声明宽和高 int width = 470, height = 470; //创建1个Bitmap对象 Bitmap bitmap = new Bitmap(width, height); Graphics g = Graphics.FromImage(bitmap); //使用Clear方法使画布为白色 g.Clear(Color.White); //抗锯齿 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; //高质量的文字 g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit; //像素均偏移0.5个单位,以消除锯齿 g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; //创建2个画笔对象 Brush brush1 = new SolidBrush(Color.Black); Brush brush2 = new SolidBrush(Color.Orange); Brush brush3 = new SolidBrush(Color.White); //创建Font对象 Font font1 = new Font("Arial", 8); /*计算每个选项所占的百分比*/ for (int i = 0; i < resultCount; i++) { arraylist_tp.Add(Convert.ToSingle(Convert.ToSingle(arraylist_count[i]) * 100 / Convert.ToSingle(sum))); } /*Bar Chart为画柱形图*/ if (com_chart.Text == "Bar Chart") { //绘制显示文字、柱形图 for (int i = 0; i < resultCount; i++) { g.DrawString(arraylist_type[i].ToString() + " :", font1, brush1, new Point(20, 10 + i * 30)); g.FillRectangle(brush2, 130, 10 + i * 30, Convert.ToSingle(arraylist_tp[i]), 17); g.DrawString(arraylist_count[i].ToString() + "条 , " +
                arraylist_tp[i].ToString() + "%", font1, brush1, new Point(135 + Convert.ToInt32(arraylist_tp[i]), 10 + i * 30)); } } /*Pie Chart为画饼形图*/ else if (com_chart.Text == "Pie Chart") { const double T = 3.14; /*Π的常量值*/ double halfangle = 0.0; int piex = 100, piey = 100, piew = 250, pieh = 250; /*计算每个选项所占饼形图的角度*/ for (int i = 0; i < resultCount; i++) { arraylist_angle.Add(Convert.ToSingle(360/Convert.ToSingle(sum)) * Convert.ToSingle(arraylist_count[i])); } //绘制饼形图   for (int i = 0; i < resultCount; i++) { float tem_angle = 0; for (int j = 0; j < i; j++) { tem_angle = tem_angle + Convert.ToSingle(arraylist_angle[j]); }
                
                /*Get_Color(),是一个循环取色的方法,代码在后面*/ g.FillPie(
    new SolidBrush(Get_Color(i)),piex,piey,piew,pieh,tem_angle,Convert.ToSingle(arraylist_angle[i])); /*以下是对四个象限、以及对90度、180度、270度和360度的判断*/ if (tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 < 90) { halfangle = tem_angle + (Convert.ToSingle(arraylist_angle[i])) / 2; double tem_sin = Math.Sin(T / 180 * halfangle); double tem_cos = Math.Cos(T / 180 * halfangle); int y = Convert.ToInt32(125 * tem_sin); int x = Convert.ToInt32(125 * tem_cos); g.DrawString(arraylist_type[i].ToString(), font1, brush1, new Point(225 + x, 225 + y)); g.DrawString((Convert.ToInt32(arraylist_tp[i])).ToString() + "%", font1, brush1, new Point(225 + x, 225 + y + 12)); } else if (tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 == 90) { g.DrawString(arraylist_type[i].ToString(), font1, brush1, new Point(225, 225 + 125)); g.DrawString((Convert.ToInt32(arraylist_tp[i])).ToString() + "%", font1, brush1, new Point(225, 225 + 125 + 12)); } else if (tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 > 90 && tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 < 180) { halfangle = (180 - tem_angle - Convert.ToSingle(arraylist_angle[i]) / 2); double tem_sin = Math.Sin(T / 180 * halfangle); double tem_cos = Math.Cos(T / 180 * halfangle); int y = Convert.ToInt32(125 * tem_sin); int x = Convert.ToInt32(125 * tem_cos); g.DrawString(arraylist_type[i].ToString(), font1, brush1, new Point(225 - x, 225 + y)); g.DrawString((Convert.ToInt32(arraylist_tp[i])).ToString() + "%", font1, brush1, new Point(225 - x, 225 + y + 12)); } else if (tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 == 180) { g.DrawString(arraylist_type[i].ToString(), font1, brush1, new Point(225 - 125, 225)); g.DrawString((Convert.ToInt32(arraylist_tp[i])).ToString() + "%", font1, brush1, new Point(225 - 125, 225 + 12)); } else if (tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 > 180 && tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 < 270) { halfangle = (tem_angle - 180 + Convert.ToSingle(arraylist_angle[i]) / 2); double tem_sin = Math.Sin(T / 180 * halfangle); double tem_cos = Math.Cos(T / 180 * halfangle); int y = Convert.ToInt32(125 * tem_sin); int x = Convert.ToInt32(125 * tem_cos); g.DrawString(arraylist_type[i].ToString(), font1, brush1, new Point(225 - x, 225 - y)); g.DrawString((Convert.ToInt32(arraylist_tp[i])).ToString() + "%", font1, brush1, new Point(225 - x, 225 - y + 12)); } else if (tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 == 270) { g.DrawString(arraylist_type[i].ToString(), font1, brush1, new Point(225, 225 - 125)); g.DrawString((Convert.ToInt32(arraylist_tp[i])).ToString() + "%", font1, brush1, new Point(225, 225 - 125 + 12)); } else if (tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 > 270 && tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 < 360) { halfangle = (360 - tem_angle - Convert.ToSingle(arraylist_angle[i]) / 2); double tem_sin = Math.Sin(T / 180 * halfangle); double tem_cos = Math.Cos(T / 180 * halfangle); int y = Convert.ToInt32(125 * tem_sin); int x = Convert.ToInt32(125 * tem_cos); g.DrawString(arraylist_type[i].ToString(), font1, brush1, new Point(225 + x, 225 - y)); g.DrawString((Convert.ToInt32(arraylist_tp[i])).ToString() + "%", font1, brush1, new Point(225 + x, 225 - y + 12)); } else if (tem_angle + Convert.ToSingle(arraylist_angle[i]) / 2 == 360) { g.DrawString(arraylist_type[i].ToString(), font1, brush1, new Point(225 + 125, 225)); g.DrawString((Convert.ToInt32(arraylist_tp[i])).ToString() + "%", font1, brush1, new Point(225 + 125, 225 + 12)); } } }         
           /*需要在界面上拉一个PictureBox控件*/ pictureBox1.Image
    = bitmap; }
            /*动态取色的函数*/
            private Color Get_Color(int itemindex)
            {
                Color objColor = new Color();
                int remainder = itemindex % 5;
                switch (remainder)
                {
                    case 0:
                        objColor = Color.FromArgb(57, 134, 155);
                    break;
    
                    case 1:
                        objColor = Color.FromArgb(70,161,185);
                    break;
    
                    case 2:
                        objColor = Color.FromArgb(124,187,207);
                    break;
    
                    case 3:
                        objColor = Color.FromArgb(181,212,224);
                    break;
    
                    case 4:
                        objColor = Color.FromArgb(200,230,245);
                    break;
    
                    default:
                        objColor = Color.Yellow;
                    break;                 
                }
                return objColor;
            }
  • 相关阅读:
    Linux文件系统的层级结构
    3.求m+mm+mmm+…+m…m(n个)的和,其中m为1~9之间的整数。 例如,当m=3、n=4时,求3+33+333+3333的和。
    编写一个Java程序,计算一下1,2,…,9这9个数字可以组成多少个互不相同的、无重复数字的三位偶数。
    抽象类和抽象方法
    定义一个“点”(Point)类用来表示三维空间中的点(有三个坐标)。要求如下: (1)可以生成具有特定坐标的点对象。 (2)提供可以设置三个坐标的方法。 (3)提供可以计算该“点”距原点距离平方的方法。 (4)编写主类程序验证。
    (1)定义一个接口CanFly,描述会飞的方法public void fly(); (2)分别定义类飞机和鸟,实现CanFly接口。 (3)定义一个测试类,测试飞机和鸟,在main方法中创建飞机对象和鸟对象, 再定义一个makeFly()方法,其中让会飞的事物飞。并在main方法中调用该方法, 让飞机和鸟起飞。
    (1)定义一个接口Compute含有一个方法int computer(int n,int m); (2)设计四个类分别实现此接口,完成+-*/运算 (3)设计一个类UseCompute,含有方法: public void useCom(Compute com, int one, int two) (4)设计一个测试类
    完成Adventure中的主方法
    中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产。请编写一个java应用程序描述上述的体制现象。
    (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n!); (4)编写测试类E测试
  • 原文地址:https://www.cnblogs.com/guolebin7/p/2862941.html
Copyright © 2011-2022 走看看