c#画曲线问题

yongyuandeyezi 2014-03-13 10:02:21
随机产生数据,每产生一个点就调用画曲线的函数,函数如下,每次只刷新一小块,为什么曲线显示时偶尔曲线会断
private void DrawWave(int data)
{
Graphics graph = picture.CreateGraphics();
Pen pen = new Pen(Color.Black, 1);
SolidBrush solidBrush = new SolidBrush(Color.White);
graph.FillRectangle(solidBrush, x + 1, 0, 20, this.Height);
graph.DrawLine(pen, x, picture.Height / 2 - oldy, x + 1, picture.Height / 2 - data);
oldy= data;
x++;
if (x >= picture.Width)
x = 0;
}
是不是窗体自动重绘了背景?怎么解决
...全文
415 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yongyuandeyezi 2014-03-18
  • 打赏
  • 举报
回复
好吧 谢谢大哥的帮助 这种硬伤我也没办法 ,顺便加一句:I'm a girl
MikeCheers 2014-03-18
  • 打赏
  • 举报
回复
大哥,你显存不够了,要么就是CPU Over了。 别闹好么
yongyuandeyezi 2014-03-17
  • 打赏
  • 举报
回复
我按照楼上说的改成 graph.FillRectangle(solidBrush, x + 1, 0, 1, this.Height);还是会出现空白,另外我可能还是没表达清楚,我将背景色和填充的颜色设为不同的颜色,例如背景色是绿色,而填充的是白色。运行时,背景一点一点被刷成白色,曲线也一点一点画出来,出现的问题是,偶尔曲线已经显示出来了,但是马上又会被背景色覆盖了,即出现大片的绿色背景,楼上可以运行一下我的代码大概就明白什么意思了
yongyuandeyezi 2014-03-17
  • 打赏
  • 举报
回复
yongyuandeyezi 2014-03-17
  • 打赏
  • 举报
回复

[/quote]

不会的 你的问题我是亲测过的
BinaryWriter writer = new BinaryWriter(new MemoryStream());
Console.WriteLine("x ==> {0}", x);
Graphics graph = picture.CreateGraphics();
Pen pen = new Pen(Color.Black, 1);
SolidBrush solidBrush = new SolidBrush(Color.White);
graph.FillRectangle(solidBrush, x + 1, 0, 1, this.Height);
graph.DrawLine(pen, x, picture.Height / 2 - oldy1+5, x + 1, picture.Height / 2 - data+5);
oldy1 = data;
x++;

if (x >= picture.Width)
{
x = 0;
}
graph.Flush();
graph.Dispose();


唯一的不同可能就是你没有加
graph.Flush();
graph.Dispose();

但我测试了 我这里去掉它 也没有什么影响 你可以测试下我的代码[/quote]
我试了你的代码,我画图用的是picturebox,还是会出现空白,结果如下
是不是应该设置一些什么属性,我发现我将一个QQ聊天的窗口覆盖到运行界面上,再挪开QQ窗口,被覆盖那部分就变成背景色了,还有我将窗口最大化最小化都会出现一部分曲线被背景色覆盖
MikeCheers 2014-03-17
  • 打赏
  • 举报
回复
呃 前两行多余 不是你这个case里的 去掉就好
MikeCheers 2014-03-17
  • 打赏
  • 举报
回复
引用 6 楼 u012238418 的回复:
我按照楼上说的改成 graph.FillRectangle(solidBrush, x + 1, 0, 1, this.Height);还是会出现空白,另外我可能还是没表达清楚,我将背景色和填充的颜色设为不同的颜色,例如背景色是绿色,而填充的是白色。运行时,背景一点一点被刷成白色,曲线也一点一点画出来,出现的问题是,偶尔曲线已经显示出来了,但是马上又会被背景色覆盖了,即出现大片的绿色背景,楼上可以运行一下我的代码大概就明白什么意思了
不会的 你的问题我是亲测过的
BinaryWriter writer = new BinaryWriter(new MemoryStream());
Console.WriteLine("x ==> {0}", x);
Graphics graph = picture.CreateGraphics();
Pen pen = new Pen(Color.Black, 1);
SolidBrush solidBrush = new SolidBrush(Color.White);
graph.FillRectangle(solidBrush, x + 1, 0, 1, this.Height);
graph.DrawLine(pen, x, picture.Height / 2 - oldy1+5, x + 1, picture.Height / 2 - data+5);
oldy1 = data;
x++;

if (x >= picture.Width)
{
    x = 0;
}
graph.Flush();
graph.Dispose();
唯一的不同可能就是你没有加 graph.Flush(); graph.Dispose(); 但我测试了 我这里去掉它 也没有什么影响 你可以测试下我的代码
yongyuandeyezi 2014-03-15
  • 打赏
  • 举报
回复
求大神们指导,感激不尽
MikeCheers 2014-03-15
  • 打赏
  • 举报
回复
终于晓得你的意思了 问题出在这里 graph.FillRectangle(solidBrush, x + 1, 0, 20, this.Height); // 这里, 你每次都会覆盖20个单位 graph.DrawLine(pen, x, picture.Height / 2 - oldy1, x + 1, picture.Height / 2 - data); // 画线只画了(x+1) - x = 1个单位 改成 graph.FillRectangle(solidBrush, x + 1, 0, 1, this.Height); 另外一个问题 就是picture.Height / 2 - data 会有负数 不会画到图上 也会产生空白
yongyuandeyezi 2014-03-14
  • 打赏
  • 举报
回复
我之所以用矩形覆盖,是要局部重绘,显示下一个点,出现的问题是画出来的曲线有时会一大段被覆盖,而且是被背景色覆盖,所以出现曲线不连续,现将源码附上,求各位指导 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; using System.Threading; using System.Collections; //线程命名空间 using System.IO; using System.Net.Sockets; namespace drawcurve_point { public partial class Form1 : Form { public Form1() { InitializeComponent(); //this.Resize += new EventHandler(picture_Resize); //窗体改变大小 } private static bool _Exit = false; //標記是否已中斷測試程序 private int x = 0; private int[] oldy = new int[16]; private int oldy1 = 0; private Random random = new Random();//生成随机数 private void readdata_Click(object sender, EventArgs e) { _Exit = true; ThreadPool.QueueUserWorkItem(Queue1Thread); //啟動Queue1線程 } public void Queue1Thread(object state) { while (_Exit) { int data = random.Next(DateTime.Now.Millisecond) % picture.Height; DrawWave(data); Thread.Sleep(1);//生成隨機數太快,為了看清效果,暫停n毫秒 } } #region 画曲线 private void DrawWave(int data) { Graphics graph = picture.CreateGraphics(); Pen pen = new Pen(Color.Black, 1); SolidBrush solidBrush = new SolidBrush(Color.White); graph.FillRectangle(solidBrush, x + 1, 0, 20, this.Height); /*for (int i = 0; i < 16; i++) { graph.DrawLine(pen, x, picture.Height / 17 * (i + 1) - oldy[i], x + 1, picture.Height / 17 * (i + 1) - data[i]); oldy[i] = data[i]; }*/ graph.DrawLine(pen, x, picture.Height / 2 - oldy1, x + 1, picture.Height / 2 - data); oldy1 = data; x++; if (x >= picture.Width) { x = 0; //Graphics graph1 = picture.CreateGraphics(); //graph.FillRectangle(solidBrush, 0, 0, picture.Width, picture.Height); } } } }
bdmh 2014-03-14
  • 打赏
  • 举报
回复
你的矩形区域可能覆盖了已经存在的曲线
BenBenBears 2014-03-14
  • 打赏
  • 举报
回复
FillRectangle表示填充,会覆盖。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧