首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

只告诉VB版的朋友,使用GDI+不要"踩雷"解决思路

2012-05-01 
只告诉VB版的朋友,使用GDI+不要踩雷.看了网上越来越多人开始使用GDI+绘图技术.但不可避免地,总有这样那

只告诉VB版的朋友,使用GDI+不要"踩雷".
看了网上越来越多人开始使用GDI+绘图技术.但不可避免地,总有这样那样的误区.
可能某些抄来的代码,会使得你不小心踩上"拖速度"的雷区.
之所以只在VB.NET版块发,因为我只会VB.

雷区1: OnPaint()
OpPaint并不能接管系统的绘制,但它并不是实时的,只有当窗体接收到重绘消息时才会引发.

雷区2: Paint()大多数人使用Paint()来绘图,主要是对GDI+的不了解.甚至有很多人在Paint事件里写上大量代码,使得效果更漂亮更完美.但却不知,这与OnPaint是类似的,但凡窗体收到更新消息,那么就会触发Paint事件.然而,很多情况下,我们只需要一种效果,比如:给窗体弄个渐变.这些效果画一次即可,因为它不需要动态.为什么那么多人写在Paint里呢?因为Paint画出来的图像是"融态",即任何一个物件盖住或是影响,它都会再次Paint.结果,明明效果出来了,可它却因为Paint的多绘特性,不断地重复同一件工作.
之所以罗称它为雷区,因为一个简单的原因:.net窗体中,更新界面是恐怖的,它将占用非常多的资源,并且,将使你的程序速度拖慢几十倍.

雷区3: 界面控件过多,使用代码更新
经常会看到这样的问题"我的窗体上有几十个甚至上百个LABEL,我用timer或其他来通过代码更新它们的text,结果界面闪烁厉害".
首先,我们知道,控件过多,有些情况下是不可避免的,如一些工业用软件.然而,如何避免闪烁呢?这是在多控件窗体下我们常见的情况.很多人就是使用timer或是独立线程来更新它们的text内容.然而,这是不可取的,这样会造成界面闪烁.如何避免呢?其实很简单,我们不要被控件所控制,我们应该控制控件.很多控件我们不需要使用它们的功能,而只需要它们提供显示数据,在这种情况下,使用GDI+按照那么多Label的位置画出数据来,可以省去上百个Label控件,资源省出来了,速度加上来了,何乐而不为呢?

雷区4: 图片定义导致的资源难以释放
这在我半年前刚接触GDI+时遇到的问题一样,在一段代码中dim了很多图片,然后生成,显示,结果代码完成了,资源还占着.最终,N小时后,程序因为资源不足而崩溃.这个问题我研究了很长的时间没有办法,即使使用GC,也容易造成必要的资源已经释放而报错的现象.现在,你应该学会使用Using,它是个很有意思的东西,任何可以被.dispos的对象都可以Using.在EndUsing之后,这个资源被成功释放的成功率在90%以上.

我喜欢把双缓冲和双缓存定义成两种概念:窗体双缓冲:由系统进行的类似克隆体的快速实现
内存双缓存:内存画图到显示界面的快速实现
我更应该觉得窗体双缓冲是必要的,在任何.NET窗体程序中,VS甚至可以将它设置为默认True,内存双缓存,这是GDI+的优势之一,学会它将使你的界面速度增加数倍.

先写这么多,等想到什么了再发上来.

愿使用VB的朋友界面更漂亮更专业,速度更快.

[解决办法]
学习 雷区3
[解决办法]
不用OnPaint() 或Paint,那用什么来画?
[解决办法]
学习了
[解决办法]
加个建议。重绘里的一些因定比如大小,颜色可以在一些事件中定义好。不要在PAINT再定义可以加快速度。
[解决办法]
谢谢了
[解决办法]
还是用onpaint好,如果闪了就用双缓存~;需要更新就invalidate
[解决办法]
UP!o(∩_∩)o...
[解决办法]
请问代码中
I += IIf(I >= 255, -255, 1)
这是什么意思
[解决办法]
谢谢提醒
[解决办法]
雷区4有研究

热点排行