如何避免多控件窗体重新布局时闪烁
1个回答
展开全部
需要在某容器控件中动态装载多个子控件,而且该容器控件可能需要改变WindowFormState,即从Normal转变为Maxmized,或者是其他状态转换啦, 无论如何,如果没有应用任何特殊处理,你就会发现,当容器控件状态转换时,其上的子控件在经过一阵狂闪之后(可能背景控件颜色和自身相互交替出现),最终恢复至平静; 这种情形当然无论是程序员自己和客户都不愿意看到的,现在咱们开始解释原因,以及考虑解决方案。
因为窗体控件状态转换时,windows需要负责擦除其背景,重新绘制,在一台性能并不优良的终端上(很大可能程度上客户端电脑都不是那么强劲吧) ,这个过程不是一时半会就能完成的,尤其对于很多个子控件的情况,因此就解决之道? 如果稍微写过WinForm程序的同学,肯定或多或少的用过ListView控件,简单易用嘛 :) 那么一定也知道该控件有2个比较有意思的方法:
BeginUpdate
Prevents the control from drawing until the EndUpdate method is called.
EndUpdate
Resumes drawing of the list view control after drawing is suspended by the BeginUpdate method.
btw. 其实我一开始也没任何好方法解决闪烁问题,后来偶尔想到ListView的此特性 :)
internal void BeginUpdateInternal(){
if (this.IsHandleCreated){
if (this.updateCount == 0){
this.SendMessage(11, 0, 0);}
internal bool EndUpdateInternal(bool invalidate){
if (this.updateCount <= 0){
return false;}
this.updateCount = (short) (this.updateCount - 1);
if (this.updateCount == 0){
this.SendMessage(11, -1, 0);
if (invalidate){
this.Invalidate();}}
return true;} 同样有一行代码: this.SendMessage(11, –1, 0); 11还是同一个意思,此时告知windows可以重绘ListView控件了
到这时候应该明白这2个方法含义了吧,也就是说对子控件的操作都是在一个冻结的状态中进行的,等到所有准备工作就绪,才对最终状态重新绘制,因此界面就不会出现闪烁状态.
因为窗体控件状态转换时,windows需要负责擦除其背景,重新绘制,在一台性能并不优良的终端上(很大可能程度上客户端电脑都不是那么强劲吧) ,这个过程不是一时半会就能完成的,尤其对于很多个子控件的情况,因此就解决之道? 如果稍微写过WinForm程序的同学,肯定或多或少的用过ListView控件,简单易用嘛 :) 那么一定也知道该控件有2个比较有意思的方法:
BeginUpdate
Prevents the control from drawing until the EndUpdate method is called.
EndUpdate
Resumes drawing of the list view control after drawing is suspended by the BeginUpdate method.
btw. 其实我一开始也没任何好方法解决闪烁问题,后来偶尔想到ListView的此特性 :)
internal void BeginUpdateInternal(){
if (this.IsHandleCreated){
if (this.updateCount == 0){
this.SendMessage(11, 0, 0);}
internal bool EndUpdateInternal(bool invalidate){
if (this.updateCount <= 0){
return false;}
this.updateCount = (short) (this.updateCount - 1);
if (this.updateCount == 0){
this.SendMessage(11, -1, 0);
if (invalidate){
this.Invalidate();}}
return true;} 同样有一行代码: this.SendMessage(11, –1, 0); 11还是同一个意思,此时告知windows可以重绘ListView控件了
到这时候应该明白这2个方法含义了吧,也就是说对子控件的操作都是在一个冻结的状态中进行的,等到所有准备工作就绪,才对最终状态重新绘制,因此界面就不会出现闪烁状态.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询