首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

在c#winform里面怎么画波形图?

2013-11-29 
在c#winform里面如何画波形图???我要在c#中画一张以时间为横轴,TextBox中的值为纵轴的波形图,这个该怎么画

在c#winform里面如何画波形图???
我要在c#中画一张以时间为横轴,TextBox中的值为纵轴的波形图,这个该怎么画?
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 数据点结构
        /// </summary>
        struct DataPoint
        {
            public int V;
            public DateTime T;
        }
        private const int n = 20;//点数
        private int vMax = 1;//最大值
        private const int r = 6;//点半径
        private DataPoint[] data = new DataPoint[n];//数据点
        private Point[] points = new Point[n];//坐标点
        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < n - 1; i++)
            {
                data[n - i - 1] = data[n - i - 2];
            }
            data[0].T = DateTime.Now;
            try
            {
                data[0].V = int.Parse(textBox1.Text);
            }
            catch
            {
                data[0].V = 0;
            }
            if (data[0].V > vMax)
            {
                vMax = data[0].V;//更新最大值
            }
            this.Refresh();//刷新,导致窗口重绘
        }
        //绘图函数
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            for (int i=0; i < n; i++)
            {
                DataPoint dataPoint=data[i];
                points[i].X=this.Width/n*i;
                points[i].Y=this.Height-dataPoint.V*this.Height/vMax;
                Rectangle rect = new Rectangle(points[i].X - r, points[i].Y - r, r + r, r + r);


                e.Graphics.FillEllipse(new SolidBrush(Color.Green), rect);
                e.Graphics.DrawEllipse(new Pen(Color.Red, 1), rect);
                e.Graphics.DrawString(dataPoint.T.ToShortTimeString(), this.Font, new SolidBrush(Color.Black), points[i].X, this.Height -100);
            }
            e.Graphics.DrawLines(new Pen(Color.Red, 1), points);
        }
[解决办法]
gdi+画移动波形图,类似任务管理器CPU使用率的效果
http://download.csdn.net/detail/xiaozhu39505/1820839
[解决办法]
不知道是不是这个意思.一些细节您自己完善一下.
绘制图表主要处理好坐标点.
你可能要根据数据动态更新最大值和最小值.
绘图的方式就是刷新要绘图的控件,在控件的Paint里进行重绘。
例子中有画圆、填充圆、画线,使用画布、画刷和画笔的代码。
注释不是很得体,见谅。
[解决办法]


        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 数据点结构
        /// </summary>
        struct DataPoint
        {
            public int V;
            public DateTime T;
        }
        private const int n = 20;//点数
        private int vMax = 1;//最大值
        private const int r = 6;//点半径
        private DataPoint[] data = new DataPoint[n];//数据点
        private Point[] points = new Point[n];//坐标点
        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < n - 1; i++)
            {
                data[n - i - 1] = data[n - i - 2];
            }
            data[0].T = DateTime.Now;
            try
            {
                data[0].V = int.Parse(textBox1.Text);
            }
            catch
            {
                data[0].V = 0;
            }
            if (data[0].V > vMax)
            {
                vMax = data[0].V;//更新最大值
            }
            this.Refresh();//刷新,导致窗口重绘
        }
        //绘图函数
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            for (int i=0; i < n; i++)
            {
                DataPoint dataPoint=data[i];


                points[i].X=this.Width/n*i;
                points[i].Y=this.Height-dataPoint.V*this.Height/vMax;
                Rectangle rect = new Rectangle(points[i].X - r, points[i].Y - r, r + r, r + r);
                e.Graphics.FillEllipse(new SolidBrush(Color.Green), rect);
                e.Graphics.DrawEllipse(new Pen(Color.Red, 1), rect);
                e.Graphics.DrawString(dataPoint.T.ToShortTimeString(), this.Font, new SolidBrush(Color.Black), points[i].X, this.Height -100);
            }
            e.Graphics.DrawLines(new Pen(Color.Red, 1), points);
        }


不错~图像是画在什么上面的?什么控件?
我这个直接划在窗口上了
你可以换成PictureBox。然后把绘图代码放入PictureBox的Paint事件中。
响应测量坐标的依据也由  this.Height,this.Width,变成pictureBox.Height pictureBox.Width

热点排行