记一次Winform背景闪烁问题

前言:之前很少在意这种问题,当然遇到的也比较少,毕竟写Winform的,对页面的要求本身就没多高;但是这次在写一个小工具的时候,感觉实在是看不下去,就决定动手解决一下;

事情是这个样子的,之前做Winform背景大部分都是用的纯色背景(其实是很少做背景铺色的,都是原色一把梭),所以也没有发现有闪烁的情况,但这次将背景换成图片后,在改变其大小的时候,简直都闪瞎了。随后从网上找各种解决办法,什么双缓冲啊、重写CreateParams啊等都试过了,然而并没有感觉到一点效果,当然这两种也是网上搜到的最多的答案。.

一度陷入困境,求救ChatGPT,得到的结果其实也差不多。但是有的AI工具确实给提了个醒,说是让重写OnPaintBackground事件,其实我一度是懵逼的,重写?怎么个重写,AI完全给不出代码啊,当然也可能是我提问方式有问题,毕竟AI也只是一串代码。

最后反正也是瞎猫碰上死耗子吧,实在都试过了其他方案,只有OnPaintBackground事件还有一线希望,所以在事件中进行了以下操作

 protected override void OnPaintBackground(PaintEventArgs e)        {            if (BackgroundImage != null)            {                Bitmap img = (Bitmap)BackgroundImage.Clone();                e.Graphics.DrawImage(img, 0, 0, Width, Height);                img.Dispose();            }            else            {                base.OnPaintBackground(e);            }
        }

代码意思就是,如果有背景图片的话,就不要调用父级的重绘了,自己去实现重绘,即把图片按照窗体的大小绘制上去。代码很简单,但是结果却很惊奇。虽然这样可能会导致图片拉伸,但其实这就是我想要的结果,因为窗体的背景属性我已经设置了BackgroundImageLayout=ImageLayout.Stretch;另外,关于双缓冲的代码并没有去掉,是否跟这个设置还有一点关系我不得而知,因为我觉得这句代码并没有什么坏处;

最后我们看看效果比对:

记一次Winform背景闪烁问题记一次Winform背景闪烁问题

感觉效果是相当炸裂有没有?完全不带闪的!!!