根据给定的信息,本文将详细解释如何在C# WinForm应用程序中使用GDI+来绘制饼状图和柱状图。 ### C# WinForm中绘制饼状图 #### 准备工作 首先确保你的项目中引入了必要的命名空间: ```csharp using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Data; ``` #### 绘制饼状图的步骤 1. **创建数据集**:你需要一个`DataSet`对象来存储数据。 2. **计算总数**:遍历数据集中的所有行,累加所有值以计算总数。 3. **创建图像**:创建一个`Bitmap`对象,用于保存图表。 4. **设置绘图属性**:包括缩放、平滑模式等。 5. **绘制背景矩形**:使用`DrawRectangle`方法绘制图表区域。 6. **绘制标题和子标题**:使用`DrawString`方法添加标题和子标题。 7. **绘制饼状图扇区**:使用`FillPie`和`DrawPie`方法来绘制每个扇区。 #### 示例代码 下面是一段简化后的示例代码,展示如何实现上述步骤: ```csharp public Image RenderPieChart(string title, string subTitle, int width, int height, DataSet chartData, int dataColumnIndex) { const int PIE_RADIUS = 100; const int CHART_X = 100; const int CHART_Y = 65; // 获取数据表 DataTable dt = chartData.Tables[0]; // 计算总数 float sumData = 0; foreach (DataRow dr in dt.Rows) { sumData += Convert.ToSingle(dr[dataColumnIndex]); } // 创建图像 Bitmap bm = new Bitmap(width, height); using (Graphics g = Graphics.FromImage(bm)) { // 设置绘图属性 g.ScaleTransform((float)width / 400, (float)height / 400); g.SmoothingMode = SmoothingMode.AntiAlias; g.TextRenderingHint = TextRenderingHint.AntiAlias; // 绘制背景矩形 g.DrawRectangle(Pens.Black, 0, 0, 399, 399); // 绘制标题 g.DrawString(title, new Font("Tahoma", 14), Brushes.Black, new PointF(5, 5)); // 绘制子标题 g.DrawString(subTitle, new Font("Tahoma", 12), Brushes.Black, new PointF(7, 35)); // 绘制饼状图 float totalAngle = 0; foreach (DataRow dr in dt.Rows) { float angle = Convert.ToSingle(dr[dataColumnIndex]) / sumData * 360; g.FillPie(new SolidBrush(GetChartItemColor()), CHART_X, CHART_Y, PIE_RADIUS * 2, PIE_RADIUS * 2, totalAngle, angle); g.DrawPie(Pens.Black, CHART_X, CHART_Y, PIE_RADIUS * 2, PIE_RADIUS * 2, totalAngle, angle); totalAngle += angle; } // 绘制图例 PointF boxOrigin = new PointF(210, 330); PointF textOrigin = new PointF(235, 326); foreach (DataRow dr in dt.Rows) { g.FillRectangle(new SolidBrush(GetChartItemColor()), boxOrigin.X, boxOrigin.Y, 20, 10); g.DrawRectangle(Pens.Black, boxOrigin.X, boxOrigin.Y, 20, 10); float percent = Convert.ToSingle(dr[dataColumnIndex]) / sumData * 100; g.DrawString($"{percent:F2}%", new Font("Tahoma", 10), Brushes.Black, textOrigin); boxOrigin.Y += 20; textOrigin.Y += 20; } } return bm; } private Color GetChartItemColor() { // 实现颜色获取逻辑 throw new NotImplementedException(); } ``` ### C# WinForm中绘制柱状图 #### 绘制柱状图的基本步骤 1. **创建图像**:同样使用`Bitmap`对象作为基础。 2. **计算每个柱状的高度**:基于每个数据点占总数据的比例。 3. **绘制背景矩形**:用于显示图表的边界。 4. **绘制柱状图**:使用`FillRectangle`和`DrawRectangle`方法来绘制每个柱子。 5. **绘制标题和轴线**:添加图表的标题和坐标轴线。 #### 示例代码 下面是一个简化的绘制柱状图的示例代码片段: ```csharp public Image RenderBarChart(string title, string xAxisLabel, string yAxisLabel, int width, int height, DataTable data, int dataColumnIndex) { // 创建图像 Bitmap bm = new Bitmap(width, height); using (Graphics g = Graphics.FromImage(bm)) { // 设置绘图属性 g.SmoothingMode = SmoothingMode.AntiAlias; g.TextRenderingHint = TextRenderingHint.AntiAlias; // 绘制背景矩形 g.DrawRectangle(Pens.Black, 0, 0, width - 1, height - 1); // 绘制标题 g.DrawString(title, new Font("Tahoma", 14), Brushes.Black, new PointF(5, 5)); // 绘制x轴和y轴标签 g.DrawString(xAxisLabel, new Font("Tahoma", 12), Brushes.Black, new PointF(5, 35)); g.DrawString(yAxisLabel, new Font("Tahoma", 12), Brushes.Black, new PointF(15, 55)); // 计算总数 float sumData = 0; foreach (DataRow dr in data.Rows) { sumData += Convert.ToSingle(dr[dataColumnIndex]); } // 绘制柱状图 int barWidth = 50; int spacing = 10; int xStart = 100; int yStart = height - 100; foreach (DataRow dr in data.Rows) { float value = Convert.ToSingle(dr[dataColumnIndex]); float barHeight = value / sumData * (yStart - 50); g.FillRectangle(Brushes.Blue, xStart, yStart - barHeight, barWidth, barHeight); g.DrawRectangle(Pens.Black, xStart, yStart - barHeight, barWidth, barHeight); xStart += barWidth + spacing; } } return bm; } ``` 通过以上步骤,你可以轻松地在C# WinForm应用中绘制出美观且功能完整的饼状图和柱状图。这些图表不仅有助于直观地展示数据,还能提高用户界面的友好性和可读性。
using System;
using System.IO;//用于文件存取
using System.Data;//用于数据访问
using System.Drawing;//提供画GDI+图形的基本功能
using System.Drawing.Text;//提供画GDI+图形的高级功能
using System.Drawing.Drawing2D;//提供画高级二维,矢量图形功能
using System.Drawing.Imaging;//提供画GDI+图形的高级功能
namespace BaseLayer
{
public class PieChart
{
public PieChart()
{
}
//Render是图形大标题,图开小标题,图形宽度,图形长度,饼图的数据集和饼图的数据集要表示出来的数据
public Image Render(string title, string subTitle, int width, int height, DataSet chartData,int DataLine)
{
const int SIDE_LENGTH = 400;
const int PIE_DIAMETER = 200;
DataTable dt = chartData.Tables[0];
//通过输入参数,取得饼图中的总基数
float sumData = 0;
foreach(DataRow dr in dt.Rows)
{
sumData += Convert.ToSingle(dr[DataLine]);
}
//产生一个image对象,并由此产生一个Graphics对象
Bitmap bm = new Bitmap(width,height);
//设置对象g的属性
g.ScaleTransform((Convert.ToSingle(width))/SIDE_LENGTH,(Convert.ToSingle(height))/SIDE_LENGTH);
g.SmoothingMode = SmoothingMode.Default;
g.TextRenderingHint = TextRenderingHint.AntiAlias;
//画布和边的设定
g.Clear(Color.White);
g.DrawRectangle(Pens.Black,0,0,SIDE_LENGTH-1,SIDE_LENGTH-1);
//画饼图标题
g.DrawString(title,new Font("Tahoma",14),Brushes.Black,new PointF(5,5));
//画饼图的图例
g.DrawString(subTitle,new Font("Tahoma",12),Brushes.Black,new PointF(7,35));
//画饼图
float curAngle = 0;
float totalAngle = 0;
for(int i=0;i<dt.Rows.Count;i++)
{
curAngle = Convert.ToSingle(dt.Rows[i][DataLine]) / sumData * 360;
g.FillPie(new SolidBrush(ChartUtil.GetChartItemColor(i)),100,65,PIE_DIAMETER,PIE_DIAMETER,totalAngle,curAngle);
g.DrawPie(Pens.Black,100,65,PIE_DIAMETER,PIE_DIAMETER,totalAngle,curAngle);
totalAngle += curAngle;
}
//画图例框及其文字
g.DrawRectangle(Pens.Black,200,300,199,99);
g.DrawString("图表说明",new Font("Tahoma",12,FontStyle.Bold),Brushes.Black,new PointF(200,300));
//画图例各项
PointF boxOrigin = new PointF(210,330);
剩余6页未读,继续阅读
- 粉丝: 16
- 资源: 24
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助