运动模拟程序假死

c9cad 2018-01-17 09:48:55

只是简单地画了一个矩形,绕着一个矩形框运动,每次运行2分钟不到的时候,那个小方框就不能动了,请大神们指点一下。
================================================================================================

private void button1_Click(object sender, EventArgs e)
{

Timer tmr = new Timer();
tmr.Interval = 50;
tmr.Tick += new EventHandler(tmr_Tick);
tmr.Start();
}

protected override void OnPaint(PaintEventArgs e)
{
Graphics g;
g = this.pictureBox1.CreateGraphics();
g.DrawImage(DrawImg(), new Point(0, 0));//在画板的原点画出图形
g.Dispose();
base.OnPaint(e);
}

private Image DrawImg()
{
Image img = new Bitmap(1050, 300);//定义位图
Graphics g = Graphics.FromImage(img);//创建画板
g.Clear(Color.Black);
g.DrawRectangle(Pens.White, p0.X, p0.Y, WidthT - p0.X, HeightT - p0.Y);
g.FillRectangle((Brush)Brushes.White, PX - CheW / 2, PY - CheH / 2, CheW, CheH);
g.DrawString("123", new Font("Verdana", 7), new SolidBrush(Color.White), PX - CheW / 2, PY - CheH / 2 - 13);
g.DrawString("2", new Font("Verdana", 7), new SolidBrush(Color.Black), PX - CheW / 2, PY + CheH / 2 - 13);
g.DrawImage(img, new Point(0, 0));//在画板的原点画出图形
g.Dispose();
return img;

}
void tmr_Tick(object sender, EventArgs e)
{
switch (GuiDao)
{
case 1:

PX = p0.X;
PY += speed;
if (PY>=HeightT)
{
PY = HeightT;
GuiDao = 2;

}
break;
case 2:
PX += speed;
PY=HeightT;
if (PX >= WidthT)
{
PX = WidthT;
GuiDao = 3;

}
break;

default:
break;
}

this.Invalidate();
}
...全文
525 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2018-01-20
  • 打赏
  • 举报
回复
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            DrawImg(g);//在画板的原点画出图形
            base.OnPaint(e);
        }

        private Image  DrawImg(Graphics g)
        {
            //g.Clear(Color.Black);
            g.DrawRectangle(Pens.White, p0.X, p0.Y, WidthT - p0.X, HeightT - p0.Y);
            g.FillRectangle((Brush)Brushes.White, PX - CheW / 2, PY - CheH / 2, CheW, CheH);
            g.DrawString("123", new Font("Verdana", 7), new SolidBrush(Color.White), PX - CheW / 2, PY - CheH / 2 - 13);
            g.DrawString("2", new Font("Verdana", 7), new SolidBrush(Color.Black), PX - CheW / 2, PY + CheH / 2 - 13);         
            g.DrawImage(img, new Point(0, 0));//在画板的原点画出图形
      }
c9cad 2018-01-20
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
其实你并不需要 Image img = new Bitmap(1050, 300);//定义位图 而是可以直接将 Graphics 传入DrawImg
能具体说一下吗?
xuzuning 2018-01-19
  • 打赏
  • 举报
回复
其实你并不需要 Image img = new Bitmap(1050, 300);//定义位图 而是可以直接将 Graphics 传入DrawImg
c9cad 2018-01-19
  • 打赏
  • 举报
回复
谢谢各位兄弟,问题已经解决,是因为img对象没有及时销毁。
  • 打赏
  • 举报
回复
timer是方法内的局部变量,估计被GC释放了吧? 你将timer定义为类内的全局变量
正怒月神 2018-01-17
  • 打赏
  • 举报
回复
tmr.Interval = 50; 你这个 50毫秒触发一次吗?
xian_wwq 2018-01-17
  • 打赏
  • 举报
回复
自行测试下timer中执行函数花费的时间大概多少 如果timer每一轮的时间都超过了interval, 而timer中的函数是不可重入的, 那结果就是不可预期

110,532

社区成员

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

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

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