从一个舆论调查的制作谈面向对象的编程思路(四)
2008-05-01 03:27
387 查看
public MyChart()
{
//
// TODO: Add Constructor Logic here
//
m_arrItems = new ArrayList() ;
m_strTitle = "" ;
m_objBackColor = Color.White ;
m_intWidth = 200 ;
m_intHeight = 200 ;
m_intChartType = ChartType.Pie ;
m_strUnit = "" ;
}
/// <summary>
/// 重载构造函数
/// </summary>
/// <param name="a_strTitle"> </param>
/// <param name="a_objBackColor"> </param>
/// <param name="a_intWidth"> </param>
/// <param name="a_intHeight"> </param>
/// <param name="a_intChartType"> </param>
/// <param name="a_strUnit"> </param>
public MyChart(string a_strTitle , System.Drawing.Color a_objBackColor ,
int a_intWidth , int a_intHeight , ChartType a_intChartType , string a_strUnit)
{
m_arrItems = new ArrayList() ;
m_strTitle = a_strTitle ;
m_objBackColor = a_objBackColor ;
m_intWidth = a_intWidth ;
m_intHeight = a_intHeight ;
m_intChartType = a_intChartType ;
m_intTotalCount = 0 ;
m_strUnit = a_strUnit ;
}
/// <summary>
/// 添加一个新的统计图项目
/// </summary>
/// <param name="a_objItem"> </param>
public void AddItem(object a_objItem)
{
if(a_objItem is MyClass.Util.ChartItem)
{
m_arrItems.Add(a_objItem) ;
m_intTotalCount += ((ChartItem)a_objItem).Count ;
}
else
{
throw(new Exception("对象类型错误,要加入的必须是ChartItem对象")) ;
}
}
/// <summary>
/// 产生统计图图片
/// </summary>
/// <param name="a_strFileName">要保存的文件名 </param>
/// <remarks>
/// a_strFileName必须是绝对物理路径
/// </remarks>
public void Create(string a_strFileName)
{
//如果没有定义统计图项,则抛出异常
if (m_arrItems.Count == 0)
{
throw(new Exception("没有定义统计图项")) ;
}
//根据不同统计图类型选择函数
switch(m_intChartType)
{
case ChartType.Bar:
DrawBar(a_strFileName) ;
break;
case ChartType.Pie:
DrawPie(a_strFileName) ;
break ;
case ChartType.Curve:
DrawCurve(a_strFileName) ;
break ;
default:
DrawPie(a_strFileName) ;
break ;
}
}
/// <summary>
/// 画条形图
/// </summary>
/// <param name="a_strFileName">要保存的图片名称</param>
protected void DrawBar(string a_strFileName)
{
//绘图准备,新建一个image对象,一个graphics对象
System.Drawing.Image myBmp = new Bitmap(m_intWidth , m_intHeight ) ;
System.Drawing.Graphics g = Graphics.FromImage(myBmp) ;
//填充背景
g.FillRectangle(new System.Drawing.SolidBrush(m_objBackColor) , 0 , 0 , m_intWidth , m_intHeight) ;
//如果没有任何回答,则显示没有结果
if (this.m_intTotalCount == 0)
{
g.DrawString("没有统计数字!" , new Font("宋体" , m_intWidth / 14) ,
new SolidBrush(Color.Red) , (m_intWidth - m_intWidth / 8 * 6) / 2 ,
m_intHeight / 2 - m_intWidth / 8) ;
}
else
{
//写题目
//g.DrawString(m_strTitle , new System.Drawing.Font("黑体" , m_intWidth / 30) ,
// new System.Drawing.SolidBrush(Color.Black) , (m_intWidth - m_strTitle.Length * (m_intWidth / 30))/2 , 10 ,
// System.Drawing.StringFormat.GenericDefault) ;
//画统计图项目的矩形
//计算每个矩形的宽度
int intWidth = m_intWidth / (m_arrItems.Count * 2 - 1) ;
//定义一个一个像素宽的黑色的笔
System.Drawing.Pen pen = new System.Drawing.Pen(new System.Drawing.SolidBrush(Color.Black) , 1) ;
for (int i = 0 ; i < m_arrItems.Count ; i ++)
{
ChartItem item = (ChartItem)m_arrItems[i] ;
//计算所占百分比
float intPercent = (float)Decimal.Divide(item.Count * 100 , m_intTotalCount) ;
//计算矩形高度
int intHeight = (int)(m_intHeight/ 3 * 2 * intPercent / 100 - 10) ;
//计算矩形坐标
int ix = intWidth * i * 3 / 2 + intWidth ;
int iy = m_intHeight / 3 * 2 - intHeight ;
//画矩形
g.FillRectangle(new System.Drawing.SolidBrush(item.Color) ,
ix , iy , intWidth , intHeight + 10) ;
//写字
//计算字体大小
int intFontSize = intWidth / this.TotalCount.ToString().Length ;
//限制一下,字体大小不能超过12
intFontSize = intFontSize > 12 ? 12 : intFontSize ;
g.DrawString(item.Count.ToString() + m_strUnit ,
new System.Drawing.Font("宋体" , intFontSize) ,
new System.Drawing.SolidBrush(item.Color) ,
ix , iy - intFontSize * 2) ;
//画图例
//计算字体大小
intFontSize = m_intHeight / 3 / m_arrItems.Count / 2 - 1 ;
intFontSize = intFontSize > 12 ? 12 : intFontSize ;
g.FillRectangle(new System.Drawing.SolidBrush(item.Color) , 20 ,
m_intHeight / 3 * 2 + intFontSize * (i * 2 + 1) + 5 ,
intFontSize , intFontSize) ;
g.DrawString( intPercent.ToInt32().ToString() + "%" ,
new System.Drawing.Font("宋体" , intFontSize) ,
new System.Drawing.SolidBrush(item.Color) ,
20 + intFontSize ,
m_intHeight / 3 * 2 + intFontSize * (i * 2 + 1) + 5) ;
g.DrawString(item.Text ,
new System.Drawing.Font("宋体" , intFontSize) ,
new System.Drawing.SolidBrush(item.Color) , 80 ,
m_intHeight / 3 * 2 + intFontSize * (i * 2 + 1) + 5) ;
}
//画标志线
g.DrawLine(pen , 0 , 10 , 0 , m_intHeight / 3 * 2 + 10) ;
g.DrawLine(pen , 0 , m_intHeight / 3 * 2 + 10 , m_intWidth ,
m_intHeight / 3 * 2 + 10) ;
for (int i = 0 ; i < 10 ; i++)
{
g.DrawLine( pen , 0 , m_intHeight / 3 * 2 / 10 * i + 10 ,
5 , m_intHeight / 3 * 2 / 10 * i + 10) ;
共3页: 上一页 1 [2] [3] 下一页
{
//
// TODO: Add Constructor Logic here
//
m_arrItems = new ArrayList() ;
m_strTitle = "" ;
m_objBackColor = Color.White ;
m_intWidth = 200 ;
m_intHeight = 200 ;
m_intChartType = ChartType.Pie ;
m_strUnit = "" ;
}
/// <summary>
/// 重载构造函数
/// </summary>
/// <param name="a_strTitle"> </param>
/// <param name="a_objBackColor"> </param>
/// <param name="a_intWidth"> </param>
/// <param name="a_intHeight"> </param>
/// <param name="a_intChartType"> </param>
/// <param name="a_strUnit"> </param>
public MyChart(string a_strTitle , System.Drawing.Color a_objBackColor ,
int a_intWidth , int a_intHeight , ChartType a_intChartType , string a_strUnit)
{
m_arrItems = new ArrayList() ;
m_strTitle = a_strTitle ;
m_objBackColor = a_objBackColor ;
m_intWidth = a_intWidth ;
m_intHeight = a_intHeight ;
m_intChartType = a_intChartType ;
m_intTotalCount = 0 ;
m_strUnit = a_strUnit ;
}
/// <summary>
/// 添加一个新的统计图项目
/// </summary>
/// <param name="a_objItem"> </param>
public void AddItem(object a_objItem)
{
if(a_objItem is MyClass.Util.ChartItem)
{
m_arrItems.Add(a_objItem) ;
m_intTotalCount += ((ChartItem)a_objItem).Count ;
}
else
{
throw(new Exception("对象类型错误,要加入的必须是ChartItem对象")) ;
}
}
/// <summary>
/// 产生统计图图片
/// </summary>
/// <param name="a_strFileName">要保存的文件名 </param>
/// <remarks>
/// a_strFileName必须是绝对物理路径
/// </remarks>
public void Create(string a_strFileName)
{
//如果没有定义统计图项,则抛出异常
if (m_arrItems.Count == 0)
{
throw(new Exception("没有定义统计图项")) ;
}
//根据不同统计图类型选择函数
switch(m_intChartType)
{
case ChartType.Bar:
DrawBar(a_strFileName) ;
break;
case ChartType.Pie:
DrawPie(a_strFileName) ;
break ;
case ChartType.Curve:
DrawCurve(a_strFileName) ;
break ;
default:
DrawPie(a_strFileName) ;
break ;
}
}
/// <summary>
/// 画条形图
/// </summary>
/// <param name="a_strFileName">要保存的图片名称</param>
protected void DrawBar(string a_strFileName)
{
//绘图准备,新建一个image对象,一个graphics对象
System.Drawing.Image myBmp = new Bitmap(m_intWidth , m_intHeight ) ;
System.Drawing.Graphics g = Graphics.FromImage(myBmp) ;
//填充背景
g.FillRectangle(new System.Drawing.SolidBrush(m_objBackColor) , 0 , 0 , m_intWidth , m_intHeight) ;
//如果没有任何回答,则显示没有结果
if (this.m_intTotalCount == 0)
{
g.DrawString("没有统计数字!" , new Font("宋体" , m_intWidth / 14) ,
new SolidBrush(Color.Red) , (m_intWidth - m_intWidth / 8 * 6) / 2 ,
m_intHeight / 2 - m_intWidth / 8) ;
}
else
{
//写题目
//g.DrawString(m_strTitle , new System.Drawing.Font("黑体" , m_intWidth / 30) ,
// new System.Drawing.SolidBrush(Color.Black) , (m_intWidth - m_strTitle.Length * (m_intWidth / 30))/2 , 10 ,
// System.Drawing.StringFormat.GenericDefault) ;
//画统计图项目的矩形
//计算每个矩形的宽度
int intWidth = m_intWidth / (m_arrItems.Count * 2 - 1) ;
//定义一个一个像素宽的黑色的笔
System.Drawing.Pen pen = new System.Drawing.Pen(new System.Drawing.SolidBrush(Color.Black) , 1) ;
for (int i = 0 ; i < m_arrItems.Count ; i ++)
{
ChartItem item = (ChartItem)m_arrItems[i] ;
//计算所占百分比
float intPercent = (float)Decimal.Divide(item.Count * 100 , m_intTotalCount) ;
//计算矩形高度
int intHeight = (int)(m_intHeight/ 3 * 2 * intPercent / 100 - 10) ;
//计算矩形坐标
int ix = intWidth * i * 3 / 2 + intWidth ;
int iy = m_intHeight / 3 * 2 - intHeight ;
//画矩形
g.FillRectangle(new System.Drawing.SolidBrush(item.Color) ,
ix , iy , intWidth , intHeight + 10) ;
//写字
//计算字体大小
int intFontSize = intWidth / this.TotalCount.ToString().Length ;
//限制一下,字体大小不能超过12
intFontSize = intFontSize > 12 ? 12 : intFontSize ;
g.DrawString(item.Count.ToString() + m_strUnit ,
new System.Drawing.Font("宋体" , intFontSize) ,
new System.Drawing.SolidBrush(item.Color) ,
ix , iy - intFontSize * 2) ;
//画图例
//计算字体大小
intFontSize = m_intHeight / 3 / m_arrItems.Count / 2 - 1 ;
intFontSize = intFontSize > 12 ? 12 : intFontSize ;
g.FillRectangle(new System.Drawing.SolidBrush(item.Color) , 20 ,
m_intHeight / 3 * 2 + intFontSize * (i * 2 + 1) + 5 ,
intFontSize , intFontSize) ;
g.DrawString( intPercent.ToInt32().ToString() + "%" ,
new System.Drawing.Font("宋体" , intFontSize) ,
new System.Drawing.SolidBrush(item.Color) ,
20 + intFontSize ,
m_intHeight / 3 * 2 + intFontSize * (i * 2 + 1) + 5) ;
g.DrawString(item.Text ,
new System.Drawing.Font("宋体" , intFontSize) ,
new System.Drawing.SolidBrush(item.Color) , 80 ,
m_intHeight / 3 * 2 + intFontSize * (i * 2 + 1) + 5) ;
}
//画标志线
g.DrawLine(pen , 0 , 10 , 0 , m_intHeight / 3 * 2 + 10) ;
g.DrawLine(pen , 0 , m_intHeight / 3 * 2 + 10 , m_intWidth ,
m_intHeight / 3 * 2 + 10) ;
for (int i = 0 ; i < 10 ; i++)
{
g.DrawLine( pen , 0 , m_intHeight / 3 * 2 / 10 * i + 10 ,
5 , m_intHeight / 3 * 2 / 10 * i + 10) ;
共3页: 上一页 1 [2] [3] 下一页
相关文章推荐
- 从一个舆论调查的制作谈面向对象的编程思路(五)
- 从一个舆论调查的制作谈面向对象的编程思路(二)
- 从一个舆论调查的制作谈面向对象的编程思路(三)
- 从一个舆论调查的制作谈面向对象的编程思路(一)
- 转:开心网争车位外挂制作的编程思路
- 开心网争车位外挂制作的编程思路
- 【原理思路】斐波那契堆各操作编程思路
- Flash 实用编程百例解读——Loading的制作(转贴)
- PHP面向对象之接口编程
- 编程挑战之罐子和硬币思路
- 面向接口设计和编程——(面向对象、面向接口、面向过程、面向实现) --转载
- 关卡原型制作思路
- C/C++学习笔记(五)面向对象的编程
- 基于TinyOS的定时器使用以及编程的一般思路
- 我们需要养成面向对象的编程习惯
- 学习心得:在c 中用面向对象的思想编程
- 从零开始学java:面向过程,面向对象等编程思想个人理解
- Blockly编程:用Scratch制作游戏愤怒的小牛(小鸟)
- 面向UI编程框架:ui.js框架思路详细设计
- 编程思路。自己认为应该朝着这个方向想