修剪图形

图形(图片和图形方法)要消耗许多内存。从某种程度上说,这是不可避免的:图形包含很多信息,所以规模巨大。但在许多情况下,通过以下方法,可减少图形对应用程序大小的影响:

使用 Image 控件显示位图

在许多 Visual Basic 应用程序中, Picture 控件仅仅被用于单击和拖放。如果您也是这样使用 Picture 控件的,这就浪费了许多 Windows 资源。为了避免浪费资源, Image 控件就比 Picture 控件好。每一个 Picture 控件是一个真正的窗口,使用了大量的系统资源。而 Image 控件是轻图形控件而不是一个窗口,并且使用的资源不多。其实,典型情况是:使用五到十个 Image 控件相当于使用一个 Picture 控件。另外, Image 控件重画的速度比 Picture 控件快。只有在需要仅 Picture 控件才有的性能时才使用它,如动态数据交换 (DDE)、图形方法或包含其它控件的能力。

需要时从文件中加载位图并共享图片

在设计时,设置 Picture 属性,图形就会被添加到窗体中,增加了窗体在运行时所用的内存。通过将图片存储资源文件,并在运行时使用 LoadResPicture 加载图片,可以减少内存消耗。如果并没有用到所有与窗体关联的图片,那么这一技术比将所有图片存储在窗体上的控件中节省内存。而且,由于在窗体显示前,并不需要加载所有的图片,因此加快了窗体的加载速度。

此外,可在多个 Picture 控件、 Image 控件和窗体之间共享相同图片。如果使用下列代码,则只须维护一个图片副本:

Picture = LoadPicture("C:\Windows\Chess.bmp")
Image1.Picture = Picture      '使用相同的图片。
Picture1.Picture = Picture   '使用相同的图片。

与上面相比,下列代码加载了同一位图的三个副本,占用了更多的内存和时间:

Picture = LoadPicture("C:\Windows\Chess.bmp")
Image1.Picture = LoadPicture("C:\Windows\Chess.bmp")
Picture1.Picture = LoadPicture("C:\Windows\Chess.bmp")

同样地,如果在设计时将相同的图片加载到几个窗体或控件中,每一个窗体或控件都存储了该图片的一个副本。然而,应该将图片存于一个窗体中,而让其它窗体或控件用上述的方法共享。这将使应用程序既小(因为不包含冗余的图片拷贝)又快(因为不必从磁盘中多次加载)。

使用 PaintPicture 方法

不必总将位图直接放于控件上,也可以使用 PaintPicture 方法在窗体任何地方显示位图。当在窗体中重复平铺一个位图时,这种方法特别有用:只须加载位图一次,但可以使用 PaintPicture 绘制多次。

释放图形所用内存

当不再使用窗体、图片框或图形控件中 Picture 属性的图片时,将 Picture 属性设置成 Nothing,释放空间:

Set Picture1.Picture = Nothing

如果使用图片框或窗体的 Image 属性,Visual Basic 创建一个 AutoRedraw 位图(即使 AutoRedraw 属性是 False)。在 Image 属性用完后,将 AutoRedraw 设置成 False 之前,用 Cls 方法可回收该位图所占内存。例如,下列代码回收 mypic 控件中 Image 属性所用内存:

mypic.AutoRedraw = True   '打开 AutoRedraw 位图
mypic.Cls                  '清除。
mypic.AutoRedraw = False      '关闭位图。

使用 RLE 格式位图或元文件

Visual Basic 的缺省图片格式是 bitmap (.bmp),但也可使用其它图形文件格式。有几种绘图和图形程序允许将位图存为标准压缩位图格式,称作行程编码 (Run Length Encoded) (.rle)。RLE 位图比非压缩副本小几倍,特别是那些包含大片实心颜色的位图,而且它们在加载或显示时一点也不慢。使用元文件可节省更多的内存—有些情况下,可达 10 倍或者更多。当元文件被放大或缩小时,绘图速度很慢,所以最好以原图大小使用元文件。

从 Visual Basic 5.0 开始,也支持 .gif 和 .jpg 格式。这些格式一般比较小,但是,在选择格式时应权衡图形质量和加载速度。