关于refresh和invalidate刷新问题

XuanYuanZuoLuo 2017-08-18 11:13:22
在时钟的绘制时,我采用了invalidate和refresh来进行重绘,可是每次都会导致界面发生模糊效果,不知道该怎么解决。如图所示这样。
...全文
766 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
引用 8 楼 xdashewan 的回复:
引用 7 楼 XuanYuanZuoLuo 的回复:
只能说可能能解决,form有个doublebuffered属性设置为true你先试下
开启了还是没用,边框依旧是模糊的
picturebox_paint事件里画了很多东西吗?[/quote]picturebox就画了一个时钟,其他的是控件弄进去的
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
引用 9 楼 jy251 的回复:
你的刷新在ui线程里面,所以卡主了其他ui的显示,我是这样认为的。 你需要把你的时钟逻辑放到异步线程中去,然后同步刷新picturebox
不好意思,我刚接触,有点不了解,可以说的简单一点么,谢谢
jy251 2017-08-18
  • 打赏
  • 举报
回复
你的刷新在ui线程里面,所以卡主了其他ui的显示,我是这样认为的。 你需要把你的时钟逻辑放到异步线程中去,然后同步刷新picturebox
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
引用 7 楼 XuanYuanZuoLuo 的回复:
只能说可能能解决,form有个doublebuffered属性设置为true你先试下
开启了还是没用,边框依旧是模糊的[/quote] picturebox_paint事件里画了很多东西吗?
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
引用 6 楼 xdashewan 的回复:
[quote=引用 5 楼 XuanYuanZuoLuo 的回复:] 没有,刚上手不太会用,需要用双缓冲来解决么?其实我没弄懂我问题发生在哪。虽然刚开始模糊但是拖动一下,还是可以显现出原本的文字框架
只能说可能能解决,form有个doublebuffered属性设置为true你先试下[/quote]开启了还是没用,边框依旧是模糊的
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
引用 5 楼 XuanYuanZuoLuo 的回复:
没有,刚上手不太会用,需要用双缓冲来解决么?其实我没弄懂我问题发生在哪。虽然刚开始模糊但是拖动一下,还是可以显现出原本的文字框架
只能说可能能解决,form有个doublebuffered属性设置为true你先试下
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
引用 4 楼 xdashewan 的回复:
[quote=引用 3 楼 XuanYuanZuoLuo 的回复:] 您看下三楼,第一次用,不熟悉这个
doublebuffer开启了吗[/quote]没有,刚上手不太会用,需要用双缓冲来解决么?其实我没弄懂我问题发生在哪。虽然刚开始模糊但是拖动一下,还是可以显现出原本的文字框架
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
引用 3 楼 XuanYuanZuoLuo 的回复:
您看下三楼,第一次用,不熟悉这个
doublebuffer开启了吗
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
引用 1 楼 xdashewan 的回复:
这边上是什么?别的控件还是画的其他东西?你invalidate和refresh的什么控件?
您看下三楼,第一次用,不熟悉这个
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
边上是其控件做出来的显示,我用的是invalidate,对picturebox使用,使得里面的时钟能走动,但是不知道为什么会使得周围控件也模糊了。我构建了picturebox_paint,然后末尾用了,picturebox.invalidate(true)进行模拟时钟重绘
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
这边上是什么?别的控件还是画的其他东西?你invalidate和refresh的什么控件?
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
引用 30 楼 xdashewan 的回复:
[quote=引用 29 楼 XuanYuanZuoLuo 的回复:] 我不大懂timer怎么用,可以举个例子么,谢谢
你参考那篇帖子里应该就有,如果没有,参考http://blog.csdn.net/xuemoyao/article/details/8001113 或http://www.cnblogs.com/Lotusmoon/p/5729566.html[/quote] 谢谢您,我解决了
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
引用 29 楼 XuanYuanZuoLuo 的回复:
我不大懂timer怎么用,可以举个例子么,谢谢
你参考那篇帖子里应该就有,如果没有,参考http://blog.csdn.net/xuemoyao/article/details/8001113 或http://www.cnblogs.com/Lotusmoon/p/5729566.html
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
引用 28 楼 xdashewan 的回复:
[quote=引用 27 楼 XuanYuanZuoLuo 的回复:] 去掉之后依旧和之前一样啊
this.pictureBox1.Invalidate(true);从paint里移出去,用timer或者其他方式调用[/quote] 我不大懂timer怎么用,可以举个例子么,谢谢
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
引用 27 楼 XuanYuanZuoLuo 的回复:
去掉之后依旧和之前一样啊
this.pictureBox1.Invalidate(true);从paint里移出去,用timer或者其他方式调用
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
引用 26 楼 xdashewan 的回复:
[quote=引用 25 楼 XuanYuanZuoLuo 的回复:] 这个是picturebox_paint的
base.OnPaint(e);去掉[/quote] 去掉之后依旧和之前一样啊
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
引用 25 楼 XuanYuanZuoLuo 的回复:
这个是picturebox_paint的
base.OnPaint(e);去掉
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
引用 24 楼 xdashewan 的回复:
[quote=引用 23 楼 XuanYuanZuoLuo 的回复:] 因为我是参考的,所以可能有问题,麻烦您指出来我有什么不对的,谢谢
你把代码发全,不然很难知道问题到底出在哪里[/quote] private void pictureBox1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; cen_ter.X = pictureBox1.Width / 2; cen_ter.Y = pictureBox1.Height / 2; R = cen_ter.X < cen_ter.Y ? cen_ter.X : cen_ter.Y; g.DrawArc(new Pen(Color.Black, 0.5f), new RectangleF(cen_ter.X - R, cen_ter.Y - R, 2 * R - 3, 2 * R - 3), 0, 360); for (int i = 0; i < 59; i++) { g.ResetTransform(); //重置为单位矩阵 g.TranslateTransform(cen_ter.X, cen_ter.Y); // 通过左乘指定的平移来更改系统的坐标原点 g.RotateTransform(i * 6); //旋转 ,每一秒旋转6度 if ((i == 0) || (i % 5 == 4))//绘制表盘的刻度 { g.DrawLine(new Pen(Color.Black, 2.5f), R - 12, 0, R - 5, 0); //小时标准刻度 } else { g.DrawLine(new Pen(Color.Black, 0.5f), R - 6, 0, R - 5, 0);//分钟标准刻度 } } float hour, minute, second; hour = DateTime.Now.Hour; minute = DateTime.Now.Minute; second = DateTime.Now.Second; hour = hour + minute / 60f + second / 3600f; minute = minute + second / 60f; /* g.ResetTransform(); g.TranslateTransform(cen_ter.X, cen_ter.Y);//画时针 g.RotateTransform(hour * 30 + 270 - 6); g.DrawLine(new Pen(Color.Black, 2.5f), 0, 0, R * 0.5f, 0f); //绘出时针 */ /*g.ResetTransform();//画分针 ,坐标系恢复到默认状态,Graphics对象回到默认坐标系中绘图。 g.TranslateTransform(cen_ter.X, cen_ter.Y);//通过左乘指定的平移来更改系统的坐标原点 g.RotateTransform(minute * 6 + 270 - 6); g.DrawLine(new Pen(Color.Black, 1.5f), 0, 0, R * 0.6f, 0f); */ g.ResetTransform();//画秒针 g.TranslateTransform(cen_ter.X, cen_ter.Y); g.RotateTransform(second * 6 + 270 - 6); g.DrawLine(new Pen(Color.Black, 0.5f), 0, 0, R * 0.7f, 0f);//绘出秒针 this.pictureBox1.Invalidate(true); base.OnPaint(e); }这个是picturebox_paint的
xdashewan 2017-08-18
  • 打赏
  • 举报
回复
引用 23 楼 XuanYuanZuoLuo 的回复:
因为我是参考的,所以可能有问题,麻烦您指出来我有什么不对的,谢谢
你把代码发全,不然很难知道问题到底出在哪里
XuanYuanZuoLuo 2017-08-18
  • 打赏
  • 举报
回复
引用 22 楼 xdashewan 的回复:
[quote=引用 21 楼 XuanYuanZuoLuo 的回复:] g.ResetTransform();//画秒针 g.TranslateTransform(cen_ter.X, cen_ter.Y); g.RotateTransform(second * 6 + 270 - 6); g.DrawLine(new Pen(Color.Black, 0.5f), 0, 0, R * 0.7f, 0f);//绘出秒针 this.pictureBox1.Invalidate(true); base.OnPaint(e);有用的代码估计就这些您看看
等等,你不是picturebox_paint事件里画的吗?怎么会有base.OnPaint(e);,还有继承控件?[/quote] 因为我是参考的,所以可能有问题,麻烦您指出来我有什么不对的,谢谢
加载更多回复(11)

110,500

社区成员

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

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

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