c#中在Paint函数中载入资源图为何不停地重绘?

ozonelmy 2009-04-23 10:35:01
在pictureBox控件paint函数中载入资源图片

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
System.Diagnostics.Trace.WriteLine("pictureBox1_Paint");
switch (DevState)
{
case 0:
pictureBox1.Image = DevIcon.Properties.Resources.Fan_UnStat;
break;
case 1:
pictureBox1.Image = DevIcon.Properties.Resources.Fan_Start1;
break;
case 2:
pictureBox1.Image = DevIcon.Properties.Resources.Fan_Stop1;
break;
case 3:
pictureBox1.Image = DevIcon.Properties.Resources.Fan_Fault1;
break;
case 4:
pictureBox1.Image = DevIcon.Properties.Resources.Fan_Other;
break;
}
}

debug时输出框不停地刷TRACE:pictureBox1_Paint,程序运行就不停地重绘,未使用Invalidate()函数,这是为何?
...全文
347 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yafeya 2009-04-23
  • 打赏
  • 举报
回复
OnPaint方法或者Paint事件执行或触发的条件是他的拥有者也就是你的PictureBox的任何属性发生变化,位置,大小等等,因此,OnPaint里面最好只有绘制的代码,其他的逻辑和查询数据的操作不要放在这里面执行,否则效率会很低.
himoggy 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ozonelmy 的回复:]
引用 1 楼 zgke 的回复:
如果你使用 pictureBox1.Image = DevIcon.Properties.Resources.Fan_Other;
方式 不要写在Paint 里 写在Form的Load里就可以了.


我这个图片是需要不停地变换的,不是载入一次就完事。
[/Quote]
- -所以说建议在改变DevState这个值的时候写switch (DevState)来处理图片
zgke 2009-04-23
  • 打赏
  • 举报
回复
你给 DevState 做个属性

例如

public int MyDevState
{
get{return DevState;}
set
{
switch (value)
{
case 0:
pictureBox1.Image = DevIcon.Properties.Resources.Fan_UnStat;
break;
case 1:
pictureBox1.Image = DevIcon.Properties.Resources.Fan_Start1;
break;
case 2:
pictureBox1.Image = DevIcon.Properties.Resources.Fan_Stop1;
break;
case 3:
pictureBox1.Image = DevIcon.Properties.Resources.Fan_Fault1;
break;
case 4:
pictureBox1.Image = DevIcon.Properties.Resources.Fan_Other;
break;
}
DevState=value;
}
}
Garnett_KG 2009-04-23
  • 打赏
  • 举报
回复
Paint响应WM_Paint消息,是窗口重绘时call的一个函数,当然是不停的执行了。
哈哈潜伏哥 2009-04-23
  • 打赏
  • 举报
回复
你在改变PictureBox的image属性的时候就会触发她的Paint事件,这是正常的。
如果需要不停变化,则不能将代码写到Paint事件中去,而是应用线程来解决这个问题。在线程函数中不断的为PictureBox的Image属性赋值。
应用线程的时候要注意使用委托。
51Crack 2009-04-23
  • 打赏
  • 举报
回复
没必要放Paint里,放在更改DevState的函数中即可!
ozonelmy 2009-04-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zgke 的回复:]
如果你使用 pictureBox1.Image = DevIcon.Properties.Resources.Fan_Other;
方式 不要写在Paint 里 写在Form的Load里就可以了.
[/Quote]

我这个图片是需要不停地变换的,不是载入一次就完事。
himoggy 2009-04-23
  • 打赏
  • 举报
回复
楼上UP

不过,建议在switch (DevState)《《改变DevState这个值的时候写switch (DevState)
来改变pictureBox1
zgke 2009-04-23
  • 打赏
  • 举报
回复
如果你使用 pictureBox1.Image = DevIcon.Properties.Resources.Fan_Other;
方式 不要写在Paint 里 写在Form的Load里就可以了.

110,534

社区成员

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

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

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