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

在 C# .NET 中使用 Graphics 类创建饼图

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.50/5 (14投票s)

2012 年 9 月 21 日

CPOL

3分钟阅读

viewsIcon

92444

downloadIcon

4808

本文展示了如何在 C# 中使用 Graphics 类创建饼图。

引言

此程序用于使用 C# 中的 Graphics 类创建饼图。我尽力做得最好了,但是如果有人有任何建议,请分享,以便我们都可以学习。

使用代码 

最近,我着迷于 graphics 类,并且只是在进行实验。我偶然发现了 Graphics 类的 DrawPie()FillPie() 方法。

对于一个简单的演示,我创建了一个带有五个文本框、一个按钮和一个 picturebox 的窗体,我们将在这个 picturebox 中创建一个饼图。

在创建饼图之前,我们必须始终记住,我们无法通过正常的测量来创建一个圆。 要创建一个圆,我们需要以度为单位的值。

要转换为度数,首先我们将对所有值求和,即计算所有文本框中所有值的总和,然后将每个值除以总数,然后乘以 360。

int i1 = Int32.Parse(textBox1.Text);
int i2 = Int32.Parse(textBox2.Text);
int i3 = Int32.Parse(textBox3.Text);
int i4 = Int32.Parse(textBox4.Text);
int i5 = Int32.Parse(textBox5.Text);

float total = i1 + i2 + i3 + i4 + i5 ;

float deg1 = (i1 / total) * 360;
float deg2 = (i2 / total) * 360;
float deg3 = (i3 / total) * 360;
float deg4 = (i4 / total) * 360;
float deg5 = (i5 / total) * 360;

转换值后,我们将创建一个 graphics 类的实例

Graphics graphics = pictureBox1.CreateGraphics();  

之后,我们将创建一个矩形区域,我们将在其中创建饼图

float deg1 = (i1 / total) * 360;
Rectangle rect = new Rectangle(0, 0, 150, 150);

前两个参数指定绘制点。 即 X 和 Y 坐标,第三个和第四个参数指定矩形的大小,在这种情况下,它将决定我们的饼图的大小。

如果您观察到饼图中的每个部分都用不同的颜色表示。 所以我们将做同样的事情,我们将创建五个不同的画刷

Brush brush1 = new SolidBrush(Color.Red);
Brush brush2 = new SolidBrush(Color.Blue);
Brush brush3 = new SolidBrush(Color.Maroon);
Brush brush4 = new SolidBrush(Color.Navy);
Brush brush5 = new SolidBrush(Color.YellowGreen);
graphics.Clear(pictureBox1.BackColor);

现在创建我们的饼图。 现在 graphics.FillPie(); 接受四个参数

  1. 画刷:用于填充我们在画刷中指定的部分的画刷。
  2. 矩形:将创建特定饼图的矩形区域。
  3. 起始角度:从哪里开始饼图的起始点。
  4. 扫描角度:将创建饼图的点。

基本上 graphics.FillPie(); 从不创建完整的饼图,它只是创建饼图的一个部分(弧),我们将创建一系列部分使其看起来像饼图。

graphics.FillPie(brush1, rect, 0, deg1);
graphics.FillPie(brush2, rect, deg1, deg2);
graphics.FillPie(brush3, rect, deg1 + deg2, deg3);
graphics.FillPie(brush4, rect, deg1 + deg2 + deg3, deg4);
graphics.FillPie(brush5, rect, deg1 + deg2 + deg3 + deg4, deg5);

在上面的行中,第一行将创建第一个红色部分,其起点为 0,它将创建一个计算出的度数的弧。

之后,我们的部分(弧)应该从它离开的地方开始,因此在下一行我们写了 deg1 在起始角度,在第三行我们写了 deg1+deg2,以便我们的下一个弧将从我们之前的弧离开的地方开始。

这段特定的代码不是最优化的代码,因为您可以看到我们创建了五个不同的画刷和五个不同的浮点变量,因为这些事情可以使用循环来完成。

我故意没有做到这一点,因为这可能会使一些事情变得复杂。 以下是使用循环和数组完成上述任务的优化代码。

private void createPie()
{
   iarrPieValues = new int[lstValuesCount];

   for (int iCnt = 0; iCnt < lstValuesCount; iCnt++)
   {
       iarrPieValues[iCnt] = Int32.Parse(lstValues.Items[iCnt].ToString());
       sum += iarrPieValues[iCnt];
   }

   Color[] color = { Color.Red, Color.Blue, Color.Maroon, Color.Yellow, Color.Green, Color.Indigo };
   Rectangle rect = new Rectangle(30, 10, 130, 130);

   Graphics graphics = pictureBox1.CreateGraphics();
   graphics.Clear(pictureBox1.BackColor);

   float fDegValue = 0.0f;
   float fDegSum = 0.0f;

   for (int iCnt = 0; iCnt < iarrPieValues.Length; iCnt++)
   {
       fDegValue = (iarrPieValues[iCnt] / sum) * 360;
       Brush brush = new SolidBrush(color[iCnt]);
       graphics.FillPie(brush, rect, fDegSum, fDegValue);
       fDegSum += fDegValue;
   }
}

首先,我创建了一个 int 数组,其范围为 listbox 中的值计数。 之后,我循环计算所有值的总和。

其次,我创建了一个颜色数组,这里我限制用户不要创建超过 6 个值的饼图,因为更多值意味着饼图看起来不像一个。

第三,我们使用循环创建饼图,数字到角度的转换在循环内部完成 fDegValue 用于计算角度。 在我们之前的例子中,我们对之前的值进行了求和,并将其作为第三个参数提供,这里我们用一个略有不同的方式来完成,即 fDegSum 保持总和值。

这只是一篇使用 Graphics 类创建饼图的小文章。 对于那些希望专业地创建图表的人,可以使用 .NET 提供的图表控件,并且图表控件是 .NET 4.0 的一部分,使用以前版本的人可以从 Microsoft 的网站下载这些控件。

建议

有任何建议,请通过“hari.19113@gmail.com”告知我。

谢谢。

© . All rights reserved.