在窗体指定位置上闪烁灯,就是画一个红色的圈,再画一个白色的圈

DT_hero_last 2010-12-07 10:27:51
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics dc = e.Graphics ;
int i;
i = 2;
while (true)
{
if (2 == i)
{
Pen whitePen = new Pen(Color.White, 2);
dc.DrawEllipse(whitePen, 0, 50, 50, 50);
DateTime start = DateTime.Now;
//最多循环10秒
while ((DateTime.Now - start).Seconds < 2)
{
Application.DoEvents();
}
i = 1;
}
else
{
Pen redPan = new Pen(Color.Red, 2);
dc.DrawEllipse(redPan, 0, 50, 50, 50);
DateTime start = DateTime.Now;
//最多循环10秒
while ((DateTime.Now - start).Seconds < 2)
{
Application.DoEvents();
}
i = 2;
}
}
这段代码有什么问题?
...全文
127 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
DT_hero_last 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 abrianna 的回复:]
你调试的这个vs不是在最前面么?这不就把你窗体放在后面整个都要重绘了么
[/Quote]
搞定了,谢谢你
hengsf2010 2010-12-07
  • 打赏
  • 举报
回复
要实时的释放资源,就是把X.Dispose()放在timer控件的运行中
DT_hero_last 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 abrianna 的回复:]
你调试的这个vs不是在最前面么?这不就把你窗体放在后面整个都要重绘了么
[/Quote]
额。。。。对,抱歉。
我写了释放语句。但是在程序停止的时候还是出错System.Runtime.InteropServices.ExternalException
abrianna 2010-12-07
  • 打赏
  • 举报
回复
你调试的这个vs不是在最前面么?这不就把你窗体放在后面整个都要重绘了么
DT_hero_last 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 abrianna 的回复:]
引用 6 楼 dt_hero_last 的回复:
引用 2 楼 abrianna 的回复:
whitePen ,redPan 都没释放。看你命名变量是懂gdi的,居然没有释放资源的好习惯。
在OnPaint中DoEvents,如果此时被遮挡或是引发重绘,软件就会死掉了。很容易死循环的做法。

我是初学的,怎么释放资源的?我看C#高级编程里没有讲这个。。。。


如楼上所说。执行pe……
[/Quote]
我单步调试的时候,发现第一次DoEvents的时候又执行OnPaint了,我没有挡住窗体啊,我在最后dispose(),还是不行,还是提示有问题。
来自故乡的风 2010-12-07
  • 打赏
  • 举报
回复
留个记号,学习一下!
abrianna 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dt_hero_last 的回复:]
引用 2 楼 abrianna 的回复:
whitePen ,redPan 都没释放。看你命名变量是懂gdi的,居然没有释放资源的好习惯。
在OnPaint中DoEvents,如果此时被遮挡或是引发重绘,软件就会死掉了。很容易死循环的做法。

我是初学的,怎么释放资源的?我看C#高级编程里没有讲这个。。。。
[/Quote]

如楼上所说。执行pen对象的Dispose方法.

因为OnPaint是在窗体收到WM_PAINT的时候调用的,而你的Application.DoEvents会执行消息循环,此时如果遮住屏幕又会触发OnPaint,你实际会嵌套很多次,尽量不要这么做,把这些内容放在一个定时器中实现。
sprc_lcl 2010-12-07
  • 打赏
  • 举报
回复
try: exp:
       private void button1_Click(object sender, EventArgs e)
{
Thread thr = new Thread(new ThreadStart(Run));
thr.IsBackground = true;
thr.Start();
}

private void Run()
{
int i = 0;
while (true)
{
Graphics g = this.CreateGraphics();
Pen whitePen = new Pen(Color.White, 2);
Pen redPan = new Pen(Color.Red, 2);
if (i % 2 == 0)
{
g.DrawEllipse(whitePen, 0, 50, 50, 50);
}
else
{
g.DrawEllipse(redPan, 0, 50, 50, 50);
}
g.Dispose();
i++;
Thread.Sleep(1000);
}
}
莫名其 2010-12-07
  • 打赏
  • 举报
回复
对象.Dispose();释放资源
DT_hero_last 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 abrianna 的回复:]
whitePen ,redPan 都没释放。看你命名变量是懂gdi的,居然没有释放资源的好习惯。
在OnPaint中DoEvents,如果此时被遮挡或是引发重绘,软件就会死掉了。很容易死循环的做法。
[/Quote]
我是初学的,怎么释放资源的?我看C#高级编程里没有讲这个。。。。
xiehuanxie 2010-12-07
  • 打赏
  • 举报
回复
好好的写一个死循环干嘛?
莫名其 2010-12-07
  • 打赏
  • 举报
回复
自己发出来看下
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics dc = e.Graphics ;
int i;
i = 2;
while (true)
{
if (2 == i)
{
Pen whitePen = new Pen(Color.White, 2);
dc.DrawEllipse(whitePen, 0, 50, 50, 50);
DateTime start = DateTime.Now;
//最多循环10秒
while ((DateTime.Now - start).Seconds < 2)
{
Application.DoEvents();
}
i = 1;
}
else
{
Pen redPan = new Pen(Color.Red, 2);
dc.DrawEllipse(redPan, 0, 50, 50, 50);
DateTime start = DateTime.Now;
//最多循环10秒
while ((DateTime.Now - start).Seconds < 2)
{
Application.DoEvents();
}
i = 2;
}
}
sprc_lcl 2010-12-07
  • 打赏
  • 举报
回复
有问题,死环,窗体一直假死
abrianna 2010-12-07
  • 打赏
  • 举报
回复
whitePen ,redPan 都没释放。看你命名变量是懂gdi的,居然没有释放资源的好习惯。
在OnPaint中DoEvents,如果此时被遮挡或是引发重绘,软件就会死掉了。很容易死循环的做法。

110,537

社区成员

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

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

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