WinForm 你为什么这么闪?
主页面使用了背景图和带图片的按钮6个,在运行和重绘时背景图上的按钮都是一个一个重绘,整个软件重绘时如同百叶窗一样!找了N多资料,也使用了 this.DoubleBuffered = true;
this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
但是问题依然!!请教个位大侠如何解决这个问题!!
protected override void OnPaint(PaintEventArgs e)
{
}
如何重写重绘事件可以解决这个问题1!
------解决方案--------------------1.用双缓冲
2.局部重绘
------解决方案--------------------主要是背景图片的问题,试试用一个Picturebox Fill整个窗体,再设置PictureBox的Image为你想显示的背景图
BackGroundImage显示比Image显示刷新慢
------解决方案--------------------比如说百叶窗,第一次变宽度的10%,你就重绘这10%的页面
第二次变10~20 你就重绘这一部分
这样可以提高效率减轻闪烁
------解决方案--------------------界面上的控件尽量的少是关键!
------解决方案--------------------OnPaint事件只有在窗体Resize的时候或者重新Load的时候或者调用Invalidata()的时候才会触发,知道了这个原则你就检查你的代码吧!
------解决方案--------------------每个子控件变化,父控件就要重绘一下,所以就慢了
应该在设置一些属性前, SuspendLayout(),最后ResumeLayout();
控件里面:
const int WM_SETREDRAW = 0xB;
[DllImport( "User32 ")]
static extern bool SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
private void SetRedraw(IntPtr handle, bool on)
{
SendMessage(handle, WM_SETREDRAW, on ? 1 : 0, 0);
}
SetRedraw(MyControl.Handle, false);
SetRedraw(MyControl.Handle, true);
------解决方案--------------------具体怎么写要看你的代码要怎么绘了...
------解决方案--------------------float percent;
Rectangle newValueRect = this.ClientRectangle;
Rectangle oldValueRect = this.ClientRectangle;
percent = (float)(val - min) / (max - min);
newValueRect.Width = (int)((float)newValueRect.Width * percent);
percent = (float)(oldVal - min) / (float)(max - min);
oldValueRect.Width = (int)((float)oldValueRect.Width * percent);
Rectangle updateRect = new Rectangle();
if (newValueRect.Width > oldValueRect.Width)
{
updateRect.X = oldValueRect.Size.Width;
updateRect.Width = newValueRect.Width - oldValueRect.Width;
}
else
{
updateRect.X = newValueRect.Size.Width;
updateRect.Width = oldValueRect.Width - newValueRect.Width;
}
updateRect.Height = this.Height;
this.Invalidate(updateRect);
------解决方案--------------------同病相怜!我想有没有简单一点的方法?比如,等整个窗口绘制完成以后,再显示出来?
------解决方案--------------------怪不得WPF开始把显示任务全交给显卡上的GPU了。