在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、通过对窗体和控件使用双缓冲来减少图形闪烁(当绘制图片时出现闪烁时,使用双缓冲)
对于大多数应用程序,.NET Framework 提供的默认双缓冲将提供最佳效果。默认情况下,标准 Windows 窗体控件是双缓冲的。可以通过两种方法对窗体和所创作的控件启用默认双缓冲。一种方法是将 DoubleBuffered 属性设置为 true,另一种方法是通过调用 SetStyle 方法将 OptimizedDoubleBuffer 标志设置为 true。两种方法都将为窗体或控件启用默认双缓冲并提供无闪烁的图形呈现。建议仅对已为其编写所有呈现代码的自定义控件调用 SetStyle 方法。 在构造函数里加上以下代码: 1 this.DoubleBuffered = true;//设置本窗体 2 SetStyle(ControlStyles.UserPaint, true); 3 SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景. 4 SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲 5 //SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); 6 7 //UpdateStyles();
二、C#控件的闪烁问题解决方法总结 1 protected override void WndProc(ref Message m) 2 { 3 if (m.Msg == 0x0014) // 禁掉清除背景消息 4 return; 5 base.WndProc(ref m); 6 } 成功!
注:双缓冲还是有用的,在更新不是很频繁且控件内含元素不是特别多的时候。一旦元素过多,每次更新时间都比较长,即便使用了双缓冲,仍解决不了闪烁问题。个人认为最终比较理想的方法还是禁掉清除背景消息。
三、个人在一个winfrom中测试利用timer控件对要刷新的控件进行定时刷新,可能也能起到作用。
四、C# winform 局部刷新 1 private delegate void CrossThread(); 2 Control control = ....; 3 CrossThread cross = delegate() 4 { 5 control.Refresh(); 6 }; 7 control.Invoke(cross); 这样可以让控件在其它线程刷新界面。
1 private void InvaliateControl(Control control) 2 { 3 Thread t = new Thread( 4 new ThreadStart(delegate() 5 { 6 CrossThread cross = delegate() 7 { 8 control.Refresh(); 9 }; 10 control.Invoke(cross); 11 } 12 )); 13 } 这样就可以在任何时候,调用此方法对控件进行刷新,而不将整个界面刷新。如果对于同一个控件,连续多次刷新,可以添加一个成员变量作为标记,以免同一控件连续多次刷新,提升部分性能。
原文链接:http://blog.csdn.net/weixin_40976261/article/details/78517409 对于大多数应用程序,.NET Framework 提供的默认双缓冲将提供最佳效果。默认情况下,标准 Windows 窗体控件是双缓冲的。可以通过两种方法对窗体和所创作的控件启用默认双缓冲。一种方法是将 DoubleBuffered 属性设置为 true,另一种方法是通过调用 SetStyle 方法将 OptimizedDoubleBuffer 标志设置为 true。两种方法都将为窗体或控件启用默认双缓冲并提供无闪烁的图形呈现。建议仅对已为其编写所有呈现代码的自定义控件调用 SetStyle 方法。 在构造函数里加上以下代码: 1 this.DoubleBuffered = true;//设置本窗体 2 SetStyle(ControlStyles.UserPaint, true); 3 SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景. 4 SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲 5 //SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); 6 7 //UpdateStyles();
二、C#控件的闪烁问题解决方法总结 1 protected override void WndProc(ref Message m) 2 { 3 if (m.Msg == 0x0014) // 禁掉清除背景消息 4 return; 5 base.WndProc(ref m); 6 } 成功!
注:双缓冲还是有用的,在更新不是很频繁且控件内含元素不是特别多的时候。一旦元素过多,每次更新时间都比较长,即便使用了双缓冲,仍解决不了闪烁问题。个人认为最终比较理想的方法还是禁掉清除背景消息。
三、个人在一个winfrom中测试利用timer控件对要刷新的控件进行定时刷新,可能也能起到作用。
四、C# winform 局部刷新 1 private delegate void CrossThread(); 2 Control control = ....; 3 CrossThread cross = delegate() 4 { 5 control.Refresh(); 6 }; 7 control.Invoke(cross); 这样可以让控件在其它线程刷新界面。
1 private void InvaliateControl(Control control) 2 { 3 Thread t = new Thread( 4 new ThreadStart(delegate() 5 { 6 CrossThread cross = delegate() 7 { 8 control.Refresh(); 9 }; 10 control.Invoke(cross); 11 } 12 )); 13 } 这样就可以在任何时候,调用此方法对控件进行刷新,而不将整个界面刷新。如果对于同一个控件,连续多次刷新,可以添加一个成员变量作为标记,以免同一控件连续多次刷新,提升部分性能。
原文链接:http://blog.csdn.net/weixin_40976261/article/details/78517409 |
请发表评论