实时曲线绘制
2013-05-31 11:08
162 查看
实时绘制时将图直接绘制到控件上,不要通过替换图片来实现,否则会有抖动
解决方法:
1 当然是在表单上拖置一个pictureBox控件,这里暂且name = pictureBox1
2 重载OnPaint方法:protectedoverride void OnPaint(PaintEventArgs e)
3 设置定时器timer, name =timer1, 响应timer1_Tick(),并在事件中重绘pictureBox
[也可以用Threading来sleep方法来定时]
pictureBox1.Invalidate();
4 [关键]在OnPaint()方法中绘制
5 [关键]将 pictureBox的设置为透明。属性->>backcolor->>web->>Transparent
完整代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace realtime_demo
{
public partial class Form1 : Form
{
Color backColor = Color.Black;//指定绘制曲线图的背景色
private Point[] pointList;//用来绘制曲线图的关键点,依次将这些点连接起来即得到曲线图
private Random random = new Random();//用于生成随机数
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
Point tempPoint;
base.OnPaint(e);
//注意,这里千万不可用Graphics g = this.CreateGraphics() 获得绘图变量。否则闪烁将非常厉害。
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias; //
g.SmoothingMode = SmoothingMode.HighQuality;//绘图模式默认为粗糙模式,将会出现锯齿!
pointList = new Point[pictureBox1.Width];
//初始化曲线上的所有点坐标
for (int i = 0; i < pictureBox1.Width; i++)
{
tempPoint = new Point();
//曲线的横坐标沿x轴依次递增,在横向位置上每个像素都有一个点
tempPoint.X = i;
//曲线上每个点的纵坐标随机生成,但保证在显示区域之内
tempPoint.Y = random.Next() % pictureBox1.Height;
pointList[i] = tempPoint;
}
Point p;
//将当前定位曲线图的坐标点前移,并且将横坐标减1,
//这样做的效果相当于移除当前第一个点
for (int i = 0; i < pictureBox1.Width - 1; i++)
{
p = pointList[i + 1];
pointList[i] = new Point(p.X - 1, p.Y);
}
tempPoint = new Point();
//新生成曲线图定位点的最后一个点的坐标
tempPoint.X = pictureBox1.Width;
//曲线上每个点的纵坐标随机生成,但保证在显示区域之内
tempPoint.Y = random.Next(DateTime.Now.Millisecond) % pictureBox1.Height;
//在最后再添加一个新坐标点
pointList[pictureBox1.Width - 1] = tempPoint;
g.Clear(backColor);
//绘制曲线图
g.DrawLines(new Pen(Color.Blue), pointList);
g.Dispose();
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
timer1.Interval = 1000;
}
private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Invalidate();//只重新绘制pictureBox
}
}
}
结果图:
参考文章:http://www.cnblogs.com/hocylan/archive/2008/01/03/1024753.html
解决方法:
1 当然是在表单上拖置一个pictureBox控件,这里暂且name = pictureBox1
2 重载OnPaint方法:protectedoverride void OnPaint(PaintEventArgs e)
3 设置定时器timer, name =timer1, 响应timer1_Tick(),并在事件中重绘pictureBox
[也可以用Threading来sleep方法来定时]
pictureBox1.Invalidate();
4 [关键]在OnPaint()方法中绘制
5 [关键]将 pictureBox的设置为透明。属性->>backcolor->>web->>Transparent
完整代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace realtime_demo
{
public partial class Form1 : Form
{
Color backColor = Color.Black;//指定绘制曲线图的背景色
private Point[] pointList;//用来绘制曲线图的关键点,依次将这些点连接起来即得到曲线图
private Random random = new Random();//用于生成随机数
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
Point tempPoint;
base.OnPaint(e);
//注意,这里千万不可用Graphics g = this.CreateGraphics() 获得绘图变量。否则闪烁将非常厉害。
Graphics g = e.Graphics;
g.SmoothingMode = SmoothingMode.AntiAlias; //
g.SmoothingMode = SmoothingMode.HighQuality;//绘图模式默认为粗糙模式,将会出现锯齿!
pointList = new Point[pictureBox1.Width];
//初始化曲线上的所有点坐标
for (int i = 0; i < pictureBox1.Width; i++)
{
tempPoint = new Point();
//曲线的横坐标沿x轴依次递增,在横向位置上每个像素都有一个点
tempPoint.X = i;
//曲线上每个点的纵坐标随机生成,但保证在显示区域之内
tempPoint.Y = random.Next() % pictureBox1.Height;
pointList[i] = tempPoint;
}
Point p;
//将当前定位曲线图的坐标点前移,并且将横坐标减1,
//这样做的效果相当于移除当前第一个点
for (int i = 0; i < pictureBox1.Width - 1; i++)
{
p = pointList[i + 1];
pointList[i] = new Point(p.X - 1, p.Y);
}
tempPoint = new Point();
//新生成曲线图定位点的最后一个点的坐标
tempPoint.X = pictureBox1.Width;
//曲线上每个点的纵坐标随机生成,但保证在显示区域之内
tempPoint.Y = random.Next(DateTime.Now.Millisecond) % pictureBox1.Height;
//在最后再添加一个新坐标点
pointList[pictureBox1.Width - 1] = tempPoint;
g.Clear(backColor);
//绘制曲线图
g.DrawLines(new Pen(Color.Blue), pointList);
g.Dispose();
}
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
timer1.Interval = 1000;
}
private void timer1_Tick(object sender, EventArgs e)
{
pictureBox1.Invalidate();//只重新绘制pictureBox
}
}
}
结果图:
参考文章:http://www.cnblogs.com/hocylan/archive/2008/01/03/1024753.html
相关文章推荐
- Windows CE5.0下绘制实时数据曲线
- 在VC++中用CMSChart实现实时曲线的绘制(实例)
- 用C#绘制实时曲线图
- TeeChart在VC中实时曲线绘制的应用
- 图表控件TeeChart干货分享(绘制2D、3D实时曲线---VC++示例源代码--网络首发)
- 用C#绘制实时曲线图
- TeeChart在VC中实时曲线绘制的应用
- 2010.11.25 绘制实时曲线的源码CurveCtrl.cpp
- 图表控件TeeChart干货分享(绘制2D、3D实时曲线---VC++示例源代码--网络首发)
- 用C#绘制实时曲线图
- 用C#绘制实时曲线图
- Qt customplot插件中绘制实时时间堆积曲线
- 实时曲线的绘制和保存
- 用C#绘制实时曲线图
- 用VC(Visual C++)读取串口数据并通过Flash图表类将其绘制为实时曲线
- .net绘制实时曲线之折线图
- 实时绘制曲线-SetROP2方法
- TeeChart在MFC中实时曲线绘制的应用
- 用C#绘制实时曲线图
- QwtDemo-利用qwt进行实时曲线绘制实例