C# 我切换界面时布局控件很慢是怎么回事
1个回答
展开全部
我这里速度快得很。只有轻微的闪烁感。
难道是电脑问题?
我有点明白了。
你这种编程方式会很慢的。
别用自定义控件。
自定义控件的开销太大。
用gdi手绘界面
另外,你先试试:form.doublebufferd属性。
设为true
form会在另一个缓冲区里绘好,然后复制到前台界面里。
控件太多时,直接在界面上重绘,会引起一个一个重新显示。
在显示之前还会擦掉背景,引起闪烁感。
双缓冲就是另外开一个图形窗口内存,相当于一个看不到的窗口吧!然后在后台绘制,绘完之后,把后的效果一次性复制到前台用户能看到的那个窗口。
这样就没有闪烁了。
但是你的程序如果很慢很慢,那就不是这个能解决的问题了。
那种情况下,就要考虑用gdi绘图,不用控件了。
设计一个一个表示黑白子所在位置的数据结构,比如chesses类,然后从panel类重载一个类,然后增加一个Chesses的属性。
重写这个新控件的OnPaint方法,利用Chesses属性的内容绘制棋盘。
在主窗口里,把Panael的类名改为你的新Panel, 每次有新步子之后,更新Panel的那个棋子属性,然后调用Panel的Update方法即可。
这样比新增控件的方法速度快很多。
画棋子时,可以直接用graphics.drawimage方法来绘上去即可。
在windoww7中,似乎如果短时间里切换窗口,windows7似乎会帮程序保存位图,连paint事件都不会触动。
你用自定义控件,自定义控件也是用的gdi函数重绘。
而且还要处理control的一大堆事件,还要计算布局,很慢的。
重绘方法只在操作系统认为需要重绘时,只会重绘一次。
不是不停循环的。
而且有时候OS还会要求你的程序部分重绘,只重绘无法由OS自行恢复的那一部分。
在窗口变大时,多出来的部分会部分重绘。在窗口移动时,如你在OS中设定移动中不显示内容,也会重绘。被其他窗口挡住了,又被移开时,也会重绘。
如果挡住的是一部分,则部分重绘。
程序如果想主动重绘,可以调用一下control.update或是control.invalid方法,就可以强行重绘,这可以用于你下了一步新棋时。强行重绘时,也可以计算一下大概的范围,然后强制局部重绘,这样就很快了。
难道是电脑问题?
我有点明白了。
你这种编程方式会很慢的。
别用自定义控件。
自定义控件的开销太大。
用gdi手绘界面
另外,你先试试:form.doublebufferd属性。
设为true
form会在另一个缓冲区里绘好,然后复制到前台界面里。
控件太多时,直接在界面上重绘,会引起一个一个重新显示。
在显示之前还会擦掉背景,引起闪烁感。
双缓冲就是另外开一个图形窗口内存,相当于一个看不到的窗口吧!然后在后台绘制,绘完之后,把后的效果一次性复制到前台用户能看到的那个窗口。
这样就没有闪烁了。
但是你的程序如果很慢很慢,那就不是这个能解决的问题了。
那种情况下,就要考虑用gdi绘图,不用控件了。
设计一个一个表示黑白子所在位置的数据结构,比如chesses类,然后从panel类重载一个类,然后增加一个Chesses的属性。
重写这个新控件的OnPaint方法,利用Chesses属性的内容绘制棋盘。
在主窗口里,把Panael的类名改为你的新Panel, 每次有新步子之后,更新Panel的那个棋子属性,然后调用Panel的Update方法即可。
这样比新增控件的方法速度快很多。
画棋子时,可以直接用graphics.drawimage方法来绘上去即可。
在windoww7中,似乎如果短时间里切换窗口,windows7似乎会帮程序保存位图,连paint事件都不会触动。
你用自定义控件,自定义控件也是用的gdi函数重绘。
而且还要处理control的一大堆事件,还要计算布局,很慢的。
重绘方法只在操作系统认为需要重绘时,只会重绘一次。
不是不停循环的。
而且有时候OS还会要求你的程序部分重绘,只重绘无法由OS自行恢复的那一部分。
在窗口变大时,多出来的部分会部分重绘。在窗口移动时,如你在OS中设定移动中不显示内容,也会重绘。被其他窗口挡住了,又被移开时,也会重绘。
如果挡住的是一部分,则部分重绘。
程序如果想主动重绘,可以调用一下control.update或是control.invalid方法,就可以强行重绘,这可以用于你下了一步新棋时。强行重绘时,也可以计算一下大概的范围,然后强制局部重绘,这样就很快了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询