日期:2014-05-17  浏览次数:20927 次

为什么用invalidate函数屏幕会不断地闪烁
即使我使用了invalidate(rectangle);也还是会闪。
是不是invalidate();只要一旦被调用就会不断的以一个频率不断地起作用啊?
那要怎么样避免闪烁啊?

------解决方案--------------------
控件响应WM_ERASEBKGND消息直接返回TRUE
控件使用双缓冲
SetStyle(ControlStyles.UserPaint, True) 
SetStyle(ControlStyles.DoubleBuffer, True)
------解决方案--------------------
窗体构造函数中加一句:
this.DoubleBuffered = true;
试试把。
------解决方案--------------------
Invalidate、Update、Refresh的作用和区别
避免多控件窗体闪烁
------解决方案--------------------
invalidate
就是设置无效区域。
区域无效则会导致收到2条消息:
WM_ERASEBKGND//擦除背景,同时需要重绘背景
WM_PAINT//用户内容绘制
以上两个消息都是只针对一个区域的,没有指定的时候,默认是窗体的WorkArea。

窗体闪烁,原因就是对屏幕绘制次数过多,解决方法就是双缓冲绘图,原理就是定义一个和窗体一样大小的图片,吧所有对窗体的绘制改绘制到图片上,一次性贴图到窗体减少对窗体实际操作达到避免闪烁。
双缓冲在pc下有2个途径:
1.系统的方法,见1,2楼
2.自己实现,方法见刚描述的。详细代码网上很多。我回帖也回了很多。你搜索一下是能找到具体写法答案的。