用 AutoRedraw 和 ClipControls 使图形分层

AutoRedraw 和 ClipControls 的不同组合,对图形控件和图形方法绘制屏幕有不同影响。

创建图形时,应记住图形控件和标签、非图形控件、以及图形方法,将出现在一个容器的不同层次上。这些层次变化取决于三个因素:

正常的分层

一般来说,窗体或其它容器的层次是,从前到后,如下表所示:

层次 内容
上层 非图形控件,如命令按钮、复选框、文件控件。
中层 图形控件和标签。
下层 窗体或容器的绘图区。这是图形方法显示结果的地方。

某层次中的任何对象,都会覆盖其下层的任何对象,所以用图形控件创建的图形,将出现在窗体上其它控件的后面;而用图形方法创建的图形,则出现在所有图形控件和非图形控件的下面。正常的层次排列在图 12.9 示出。

图 12.9 图形在窗体上的正常层次关系

影响分层的因素

可用几种不同的途径产生正常的分层。AutoRedraw 和 ClipControls 的不同设置组合,以及将图形方法置于事件内部或外部,都会影响层次排列和应用程序的执行速度。

下表列出 AutoRedraw 和 ClipControls 的不同组合,以及图形方法的放置方式,所造成的各种效果。


AutoRedraw

ClipControls
图形方法在 Paint 事件之内/外
分层的行为
True True
(缺省)
忽略 Paint 事件 正常的层次。
True False 忽略 Paint 事件 正常的层次。因为不需要计算或建立裁剪区域,具有许多非重叠控件的窗体会画的更快。
False
(缺省)
True
(缺省)
正常的层次。
False True 非图形控件在前。图形方法和图形控件混合将出现在中层和下层。建议不要使用此种设定。
False False 正常的层次,只影响先前被覆盖或重新调整窗体大小才出现的像素。
False False 图形方法和所有控件混合将出现在三个层次中。建议不要使用此种设定。

AutoRedraw 的效果

设置 AutoRedraw 为 True 时,总能产生正常的层次。虽然使用 AutoRedraw 是层叠图形的最简便方法,但由于 AutoRedraw 要占用内存空间,故含有较大窗体的应用程序的执行速度会降低。

ClipControls 的效果

当 AutoRedraw 为 True 时,ClipControls 的设置对图形在窗体上或容器内如何层叠没有影响。但 ClipControls 会影响窗体的显示速度。当 ClipControls 为 False 时,应用程序不创建裁剪区域。不必在裁剪区域计算或绘图以弥补漏洞,就可使窗体显示得更快些。

而且,当 AutoRedraw 和 ClipControls 都为 False 时,应用程序只重画在下述两种情况下被显露出来的窗体或容器的那些像素:

Paint 事件的影响

当 AutoRedraw 为 False 时,图形方法最好置于窗体或容器的 Paint 事件内。把图形方法局限在 Paint 事件内,能使这些方法按可预期的顺序来绘图。

当 AutoRedraw 为 False 时,在 Paint 事件之外使用图形方法,会产生不稳定的图形。每次图形方法的输出在窗体上或容器内出现时,可能会覆盖任何控件或图形方法(若 ClipControls 为 False)已经显示在那里的内容。当应用程序使用许多图形方法来产生视觉效果时,除非将这些图形方法局限于 Paint 事件内,否则对输出结果的管理是非常困难。