通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>NET专区>>正文 新版上线![旧版]
注:打开慢时请稍等

如何在C#的WinForm中制作饼状图和柱状图

http://www.iyit.net  日期:2006-6-12 1:58:45  来源:  点击:
参加讨论

      当我们的软件需要各种饼状图和柱状图来表示数据时,我们或许会想到用Offices中的图形控件或是第三方控件,但现在的第三方控件大都需要注册,有些免费的控件会有开发商的标记等。而对于使用Offices的图形控件来说,并不能在程序中得于很好控制,其使用的简易程度也较低,所以在这我给出在C#中使用GDI+实现饼状图和柱状图跟数据库联接显示数据的方法。

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);
   Graphics g = Graphics.FromImage(bm);
   //设置对象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);
   PointF textOrigin = new PointF(235,326);
   float percent = 0;
   for(int i=0;i<dt.Rows.Count;i++)
   {
    g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,20,10);
    g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,20,10);
    percent = Convert.ToSingle(dt.Rows[i][DataLine]) / sumData * 100;
    g.DrawString(dt.Rows[i].ToString() + " - " + dt.Rows[i][0].ToString() + " (" + percent.ToString("0") + "%)",new Font("Tahoma",10),Brushes.Black,textOrigin);
    boxOrigin.Y += 15;
    textOrigin.Y += 15;
   }
   //回收资源
   g.Dispose();
   return (Image) bm;
  
  }
 }
  
 //画条形图
 public class BarChart
 {
  public BarChart()
  {
  }

//Render是图形大标题,图开小标题,图形宽度,图形长度,饼图的数据集和饼图的数据集
  public Image Render(string title, string subTitle, int width, int height, DataSet chartData)
  {
   const int SIDE_LENGTH = 400;
   const int CHART_TOP = 75;
   const int CHART_HEIGHT = 200;
   const int CHART_LEFT = 50;
   const int CHART_WIDTH = 300;
   DataTable dt = chartData.Tables[0];
  
   //计算最高的点
   float highPoint = 0;
   foreach(DataRow dr in dt.Rows)
   {
    if(highPoint<Convert.ToSingle(dr[0]))
    {
     highPoint = Convert.ToSingle(dr[0]);
    }
   }
   //建立一个Graphics对象实例
   Bitmap bm = new Bitmap(width,height);
   try
   {
    Graphics g = Graphics.FromImage(bm);
    //设置条图图形和文字属性
    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 barWidth = CHART_WIDTH / (dt.Rows.Count * 2);
    PointF barOrigin = new PointF(CHART_LEFT + (barWidth / 2),0);
    float barHeight = dt.Rows.Count;
    for(int i=0;i<dt.Rows.Count;i++)
    {
     barHeight = Convert.ToSingle(dt.Rows[i][0]) * 200 / highPoint * 1;
     barOrigin.Y = CHART_TOP + CHART_HEIGHT - barHeight;
     g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),barOrigin.X,barOrigin.Y,barWidth,barHeight);
     barOrigin.X = barOrigin.X + (barWidth * 2);
    }
    //设置边
    g.DrawLine(new Pen(Color.Black,2),new Point(CHART_LEFT,CHART_TOP),new Point(CHART_LEFT,CHART_TOP + CHART_HEIGHT));
    g.DrawLine(new Pen(Color.Black,2),new Point(CHART_LEFT,CHART_TOP + CHART_HEIGHT),new Point(CHART_LEFT + CHART_WIDTH,CHART_TOP + CHART_HEIGHT));
    //画图例框和文字
    g.DrawRectangle(new Pen(Color.Black,1),200,300,199,99);
    g.DrawString("图表说明",new Font("Tahoma",12,FontStyle.Bold),Brushes.Black,new PointF(200,300));
  
    //画图例
    PointF boxOrigin = new PointF(210,330);
    PointF textOrigin = new PointF(235,326);
    for(int i=0;i<dt.Rows.Count;i++)
    {
     g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,20,10);
     g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,20,10);
     g.DrawString(dt.Rows[i].ToString() + " - " + dt.Rows[i][0].ToString(),new Font("Tahoma",10),Brushes.Black,textOrigin);
     boxOrigin.Y += 15;
     textOrigin.Y += 15;
    }
    //输出图形
    g.Dispose();
    return bm;
   }
   catch
   {
    return bm;
   }  
  }
 }
 public class ChartUtil
 {
  public ChartUtil()
  {
  }
  public static Color GetChartItemColor(int itemIndex)
  {
   Color selectedColor;
   switch(itemIndex)
   {
    case 0:
     selectedColor = Color.Blue;
     break;
    case 1:
     selectedColor = Color.Red;
     break;
    case 2:
     selectedColor = Color.Yellow;
     break;
    case 3:
     selectedColor = Color.Purple;
     break;
    default:
     selectedColor = Color.Green;
     break;
   }
   return selectedColor;
  }
 }
}

以上是一个完整的WinForm中制作饼状图和柱状图源程序,大家可以通过以上程序的更改,做出能满足自己程序的需要。



编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:在RichTextBox控件加入图片
下一篇:.Net中将图片数据保存到XML文档
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
c#写的五子棋程序,供学习WinForms的鼠 vb.net的windows窗体实现dos命令 如何用.NET创建Windows服务
C#中调用Windows API的要点 Win中Net命令的另类用法  Windows.NET Server: XML Web 服务
用Swing实现数据表格功能 在Windows NT 4.0下安装Apache+Servlet 在WIN2000下的jsp的安装
在Windows/NT上建立JSP环境 win2k下搭建jsp环境 JSP在win2000下的安装 
在windows环境下安装tomcat 在windows环境下安装tomcat win2k在apache1.3上配置tomcat3.1
Windows下JSP开发环境的配置 win2000server IIS和tomcat5多站点配置 WIN2000+PHP+MYSQL+TOMCAT+JSP完全整合
Windows2000下Apache2.0.46与Tomcat5.0 WIN98/2000下的jsp服务器 win2000下jsp平台搭建的简单过程
配置整合Win+Apache+PHP+MySQL+Tcomcat Resin在Windows系统下的安装 Windows2000下整合Mysql4.0.13与Tomcat
最新更新 热点排行 推荐新闻
使用 ASP.NET 加密口令
[ASP.NET] Session 详解
从ASP迁移至ASP+
从ASP迁移至ASP+ ----------进入DataS
从ASP迁移至ASP+ --将HTML表格转换为A
CGI教程(2)
CGI教程(3)
CGI教程(5)
CGI教程(6)
CGI教程(7)
CGI教程(8)
CGI教程(5)
CGI教学:第一章 cgilib例
CGI教学:第二章 动态创建图像
CGI教学:第三章 计数器的编写方法
为ASP.NET 2.0菜单控件增加target属性
将Asp.net页面输出为HTML
在ASP.NET中防止注入攻击
ASP.NET 2.0 中的异步页功能应用
asp.net面试试题收集
QQ密码本地破解
msn8.0下载
PPLive最新内部版本揭密
珊蝴虫QQ探测隐身的招式用法
Visual Basic 概述
exeplorer.exe错误的问题的总结、解决
Authorware7.0基础与实例教程连载 第5
解决Windows中的explorer.exe出错
Windows常见文件修复技巧
Photoshop打造美女性感纹身(2)
在ASP.NET中防止注入攻击
用ASP.NET开发Web服务的五则技巧
ASP.NET 2.0 中的异步页功能应用
Windows下的虚拟主机设置全功略
危险无处不在 Html标签带来的安全隐患
网络游戏是06年互联网最具发展潜力业务
巧用ACDSee 8.0截取QQ表情每一帧
解除瑞星 诺顿遗留下的杀毒兼容问题
第一款开源AJAX安全扫描工具Sprajax
WinRAR人性化功能揭密
在ASP.NET中防止注入攻击
用ASP.NET开发Web服务的五则技巧
Linux操作系统12则经典应用技巧
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息