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

Pocket PC 的简单条形图

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.43/5 (6投票s)

2005年11月16日

CPOL

2分钟阅读

viewsIcon

64372

downloadIcon

1425

为 Pocket PC 应用程序生成一个简单的条形图。

引言

我最近需要为 Pocket PC 应用程序生成一个条形图。网上有很多关于这个问题的资料,文章、免费软件等等,但我找不到任何适用于紧凑框架的东西。

有时作为一名开发人员,我会想为什么花费这么长时间来解决一些别人已经完成的事情?好吧,这次不是这样,所以我决定自己解决这个问题。

使用代码

本文中发布的应用程序包含一个用 C# 编写的紧凑型 Windows Forms 项目,其中包含一个没有任何控件的单个窗体。它在 PocketBarGraph 组件的 Load 事件中获取并填充虚拟数据,如下所示。其余的通过组件和该窗体的 Paint 事件完成。这里的技巧是将窗体 Paint 事件的参数 System.Windows.Forms.PaintEventArgs 发送到 graphMotor

private GraphMotor graph;
private void Data_Load(object sender, System.EventArgs e)
{
    //A new motor
    graph = new GraphMotor();      

    //I add two series of data
    graph.Graphs.Add(new ListData());
    graph.Graphs.Add(new ListData());

    //Set the color for each one
    graph.Graphs[0].DisplayColor = Color.DarkBlue;
    graph.Graphs[1].DisplayColor = Color.DarkGreen;

    PocketGraphBar.GraphPoint p;

    //Generate de dumy data
    for(int i = 1; i < 11; i++)
    {
       //A new point
       p = new PocketGraphBar.GraphPoint();
       p.X = Convert.ToDecimal(i);
       p.Y = Convert.ToDecimal(i * 100);
       graph.Graphs[0].Add(p);

       //Another new point
       p = new PocketGraphBar.GraphPoint();
       p.X = Convert.ToDecimal(i);
       p.Y = Convert.ToDecimal(i * 50);
       graph.Graphs[1].Add(p);
    }            
}
private void Data_Paint(object sender, 
       System.Windows.Forms.PaintEventArgs e)
{
 try
 {
     //In the load event the the object was filled
     //Here we only set its properties
    
     graph.LeftMargin = 20;
     graph.LegendFont = new System.Drawing.Font("Arial", 
                        8.25F, System.Drawing.FontStyle.Regular);
     graph.AxisColor = Color.Black;
     graph.MaxHeight = 200;
     //The width of each bar
     graph.Thick = 6;
     //The number of bars wa want to see 
     //for each series of data
     graph.DisplayTimes = 10;
     //Now solve this
     graph.DrawGraphs(e);               
 }
 catch(Exception ee)
 {
    MessageBox.Show(ee.ToString());
 }
}

关于组件,我们有三个类

  • GraphMotor:是解析所有逻辑的控制器类。
  • ListGraphs:是我们想要绘制的一系列数据的集合。这意味着我们可以拥有一个复合条形图。
  • ListData:是我们想要绘制的数据的集合。
  • GraphPoint:一个单一的键值对,X 和 Y,其中 Y 取决于 X 的值。

这些类的命名空间是 PocketGraphBar

关注点

  • 我已经在 GraphPoint 中使用了 decimal 类型,以便使用简单的转换或 Convert 放入任何类型的值。
  • 每个条形的高度由 value / maxValue * maxLength 确定,所以即使您需要绘制 N 位数的数值,也会进行缩放。
  • 由于 ListDataListGraphs 类实现了 System.Collections.ICollection,因此可以放置任意数量的 N 个键值对数据系列。
  • 它应该可以很好地用于常见的 Windows Forms 应用程序。

请记住,外观和感觉取决于您输入的数据逻辑,该设计用于智能设备应用程序,所以不要期望太多。条形图由 X 和 Y 值的集合组成,其中 X 是连续的(1,2,3,4... 或 2005, 2010, 2015...)。

我认为这可以作为交付更多类型的图表(饼图、线性图、面积图)的基础,但这项工作只是在一个下午完成的。

© . All rights reserved.