用 AutoRedraw 创建持久的图形

每个窗体和图片框都具有 AutoRedraw 属性。AutoRedraw 是 Boolean 属性,当它设置为 True 时,会把图形输出保存在内存里。可用 AutoRedraw 属性创建持久的图形。

持久的图形

Microsoft Windows 操纵屏幕图象,来造成重叠窗口的影像。当一个窗口移到其它窗口上时,可暂时隐藏其它窗口,移过后,被覆盖的窗口和它的内容需要重新显示。Windows 管理和控制窗口与控件的重新显示。而用户的 Visual Basic 应用程序必须控制窗体和图片框内图形的重新显示。

如果在窗体上用图形方法创建图形,通常希望它们重新显示在以前的位置 (persistent graphics),可用 AutoRedraw 属性创建持久的图形。

AutoRedraw 和窗体

AutoRedraw 的缺省值是 False。当 AutoRedraw 设置为 False,窗体上显示的任何由图形方法创建的图形如果被另一个窗口暂时挡住,将会丢失。另外,如果扩大窗体,窗体边界外的图形将会丢失。设置 AutoRedraw 为 False 的效果如图 12.6 所示。

图 12.6 设置 AutoRedraw 为 False 的效果

当窗体的 AutoRedraw 属性设置为 True 时,Visual Basic 会将图形方法适用于内存中的一块“画布”上。应用程序复制此画布的内容,以便重新显示被其它窗口暂时隐藏起来的图形。在大多数情况下,该窗体画布的大小即屏幕的大小。如果窗体的 MaxButton 属性为 False 且窗体的边界不可调,那么该画布的大小即窗体的大小。

当窗体大小可调时,该画布也可使应用程序保存超出窗体边界之外的图形。设置 AutoRedraw 为 True 的结果显示在图 12.7 中。

图 12.7 设置 AutoRedraw 为 True 的效果

AutoRedraw 和图片框

当图片框的 AutoRedraw 属性设置为 True 时,Visual Basic 仅在内存保存此图片框的可视内容。这是因为保存图片框内容的画布,与图片框大小是相同的。超出其外的图形被裁剪后,既使改变图片框的大小,也不能再显示。

使用非持久的图形

可将窗体及其所有图片框的 AutoRedraw 设置为 False 来节省内存。但那样的图形将不再自动成为持久性的。需要时必须用代码管理所有图形的重画。

可将所有想要重画的线、圆、点的代码,包括在窗体或图片框的 Paint 事件中。这种方式最适用于有限个易于重建的图形。

无论何时需要重画窗体或图片框的一部分时,都可调用 Paint 事件过程—例如,当覆盖住对象的窗口移去后,或重新调整窗体大小使得图形恢复可视时。如果 AutoRedraw 设置为 True,除非应用程序显式地调用它,否则,该对象的 Paint 过程不会被调用执行。因为对象的可视内容保存在画布中,所以不需要 Paint 事件。

注意,使用非持久的图形的决定,会影响图形在窗体或容器上的绘制方法。“用 ClipControls 裁剪区域”和“用 AutoRedraw 和 ClipControls 使图形分层”中讨论了决定是否需用非持久的图形的其它因素。

运行时改变 AutoRedraw 的设置

运行时可以改变 AutoRedraw 的设置。如果 AutoRedraw 的设置为 False,图形和 Print 方法的输出,只输出到屏幕,不到内存。当 AutoRedraw 设置为 True 时,如果用 Cls 方法清除对象,已有输出并不能被清除。这是因为输出保存在内存,必须再次设置 AutoRedraw 为 True,才能用 Cls 方法清除。

详细信息 为了得到有关 AutoRedraw 的性能含义,请参阅第十五章“性能和兼容性设计”的“优化显示速度”。为了得到有关 AutoRedraw 的性能含义的说明,请参阅“性能和兼容性设计”中的“优化显示速度”。