在 C# .NET 中使用 Graphics 类创建饼图
本文展示了如何在 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();
接受四个参数
- 画刷:用于填充我们在画刷中指定的部分的画刷。
- 矩形:将创建特定饼图的矩形区域。
- 起始角度:从哪里开始饼图的起始点。
- 扫描角度:将创建饼图的点。
基本上 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”告知我。
谢谢。