draw.cs
上传用户:tonyxiao
上传日期:2009-05-16
资源大小:39k
文件大小:5k
源码类别:

绘图程序

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Drawing;
  5. using System.Windows.Forms;
  6. namespace 实时曲线绘制
  7. {
  8.     class draw
  9.     {
  10.         public Bitmap mybitmap;//用于双缓冲的位图,和画布等大
  11.         Random rm = new Random();//随机数产生器
  12.         public void DrawLineS(Color color, float Xmax, float Ymax, PictureBox picbox, Point[] ptlist)
  13.         {
  14.             mybitmap = new Bitmap(picbox.Width, picbox.Height);//设定位图大小
  15.             Graphics doublebufferg = Graphics.FromImage(mybitmap);//从位图上获取“画布”
  16.             doublebufferg.Clear(Color.White);//用背景色刷新
  17.             //pictureBox1填充为白色,便于显示图像  500*300
  18.             Rectangle rect = new Rectangle(0, 0, picbox.Width, picbox.Height);
  19.             doublebufferg.FillRectangle(new SolidBrush(Color.White), rect);
  20.            
  21.            
  22.             //画X和Y轴
  23.             DrawXY(ref doublebufferg, picbox);
  24.             //X轴上的刻度
  25.             SetYAxis(ref doublebufferg, picbox, Ymax);
  26.             //Y轴上的刻度
  27.             SetXAxis(ref doublebufferg, picbox, Xmax);
  28.             //要显示的实时曲线部分
  29.             Point temp = new Point();
  30.             for (int j = 0; j < picbox.Width/5 - 1; j++)
  31.             {
  32.                 temp = ptlist[j + 1];
  33.                 ptlist[j] = new Point(temp.X - 5, temp.Y);
  34.             }
  35.             Point lastpt = new Point();
  36.             lastpt.X = picbox.Width;
  37.             lastpt.Y = rm.Next(DateTime.Now.Millisecond) % picbox.Height;
  38.             ptlist[picbox.Width/5 - 1] = lastpt;
  39.             doublebufferg.DrawLines(new Pen(color, 1), ptlist);
  40.             //将缓冲中的位图绘制到我们的窗体上
  41.             Graphics g1 = picbox.CreateGraphics();//创建 PictureBox窗体的画布
  42.             g1.Clear(Color.White);
  43.             g1.DrawImage(mybitmap, 0, 0);
  44.         } 
  45.         //完成X轴和Y轴的基本部分
  46.         public void  DrawXY(ref Graphics g,PictureBox picbox)
  47.         {
  48.             Pen pen = new Pen(Color.Black, 2);//画笔
  49.             SolidBrush sb = new SolidBrush(Color.Black);//话刷
  50.             
  51.             //X轴的箭头,实际上是绘制了一个三角形
  52.             Point[] xpts = new Point[3] { 
  53.                 new Point(picbox.Width - 35, picbox.Height - 32),
  54.                 new Point(picbox.Width - 35, picbox.Height - 28), 
  55.                 new Point(picbox.Width - 30, picbox.Height - 30) 
  56.                                         };
  57.             g.DrawLine(pen, 30, picbox.Height - 30, picbox.Width - 30, picbox.Height - 30);
  58.             g.DrawPolygon(pen, xpts);
  59.             g.DrawString("X", new Font("宋体", 9), sb, picbox.Width - 25, picbox.Height - 35);
  60.             //Y轴的箭头,实际上是绘制了一个三角形
  61.             Point[] ypts = new Point[3] { 
  62.                      new Point(28, 35), 
  63.                      new Point(30, 30), 
  64.                      new Point(32, 35) };
  65.               
  66.             g.DrawLine(pen, 30, picbox.Height - 30, 30, 30);
  67.             g.DrawPolygon(pen, ypts);
  68.             g.DrawString("Y", new Font("宋体", 9), sb, 15, 30);
  69.         
  70.         }
  71.       
  72.         //绘制Y轴上的刻度
  73.         public void SetYAxis(ref Graphics g,PictureBox picbox, float YMAX)
  74.         {
  75.             Pen p1 = new Pen(Color.Goldenrod, 1);
  76.             Pen p2 = new Pen(Color.Black, 2);
  77.             SolidBrush sb = new SolidBrush(Color.Black);
  78.             float ykedu = YMAX / 200;//给定的最大刻度与实际像素的比例关系
  79.             //第一个刻度的两个端点
  80.             float xl = 27, yl = picbox.Height - 30, xr = 33, yr = picbox.Height - 30;
  81.             for (int j = 0; j < picbox.Height - 60; j += 10)
  82.             {
  83.                 if (j % 50 == 0)//一个大的刻度,黑色,每隔50像素一个
  84.                 {
  85.                     g.DrawLine(p2, xl, yl - j, xr, yl - j);//刻度线
  86.                     string tempy = (j * ykedu).ToString();
  87.                     g.DrawString(tempy, new Font("宋体", 8), sb, xl - 20, yl - j - 5);
  88.                 }
  89.                 else//小刻度,金黄色,10像素一个
  90.                 { g.DrawLine(p1, xl, yl - j, xr, yl - j); }
  91.             }
  92.         }
  93.         //绘制y轴上的刻度
  94.         public void SetXAxis(ref Graphics g,PictureBox picbox, float XMAX)
  95.              {
  96.               Pen p1 = new Pen(Color.Goldenrod, 1);
  97.               Pen p2 = new Pen(Color.Black, 2);
  98.               SolidBrush sb = new SolidBrush(Color.Black);
  99.              
  100.               float xkedu = XMAX / 400;
  101.               float xt = 30, yt = picbox.Height - 33, xb = 30, yb = picbox.Height - 27;
  102.             for (int i = 0; i < picbox.Width - 60; i += 10)
  103.             {
  104.                 if (i % 50 == 0)
  105.                 {
  106.                     g.DrawLine(p2, xt + i, yt, xb + i, yb);
  107.                     string tempx = (i * xkedu).ToString();
  108.                     g.DrawString(tempx, new Font("宋体", 8), sb, xt + i - 7, picbox.Height - 25);
  109.                 }
  110.                 else { g.DrawLine(p1, xt + i, yt, xb + i, yb); }
  111.             }
  112.              }
  113.         
  114.         
  115.         }
  116.     }