当你使用vb进行绘图时,理解AutoRedraw属性和Paint事件是非常重要的。vb的绘图方法可以让程序员在窗口或Picture Box等控件上创作图形,该方法包括Circle、Line、PaintPicture、Print以及Pset,而AutoRedraw 和Paint和这些方法有密切关系。
事实上,很多绘图方法并不会按照你所预期的那样工作。只要进行一个小实验你就会明白了:新建一个标准EXE项目,然后在窗口Click事件中加入如下代码:
Me.Circle (1500, 1500), 600
现在进入运行时检查这个程序的运行情况。点击窗口,你会看到一个圆形,但这个图案马上就消失了。不管你重复点击多少次,窗口上永远也不会留下你绘制的图案。为什么这个圆无法保留在屏幕上呢?
答案就是持久性问题。窗口和窗口中的全部控件都具有持久性。这意味着vb会在内存中保留窗口和空间的内容,并在它们隐藏时及时重绘窗口,使它们再出现在屏幕上。与此相反,绘制的图形不具有持久性,它们只是绘制在屏幕上而已,并没有在内存中保留,因此当窗口隐藏又被重绘后,图案由于没有被重绘,所以消失了。
有两种方法可以确保绘制的图形具有持久性。第一种方法是将窗口的AutoRedraw属性设为True。这会确保任何绘图方法所输出的图形都会保存在内存中,这样输出的图案就具有了持久性,可以进行重绘了。
第二种方法是在窗口的Paint事件中进行绘图。Paint事件会在窗口第一次显示时被触发,之后每次窗口重绘,Paint事件都会再次被触发。要想看看这种方法的效果,只需要把刚才的代码从Click事件移到Paint事件即可,你会发现窗口启动时就会出现一个圆形,并且当窗口从最小化恢复后,图案依然存在。
需要注意的是,当AutoRedraw属性被设为True时,Paint事件就不再被触发了。至于要选用何种方法,完全看你的程序要求。一般来说,将AutoRedraw属性设为True可以简化程序,但它会耗费一定的内存空间,尤其是当图形比较复杂时,它会使显示速度变慢。
需要记住的是,持久性问题只出现在绘图方法中,而控件、位图、metafiles等则都具有持久性。