分类:
2009-10-11 13:51:12
来源:cww 我们发现,在Form或PictureBox中有一个Picture属性物件,另外还有一个Image属性物 件,Picture物件应该很清楚,它是用来存放图形资讯的,可是Image呢?它也是用来存 图形资讯,但二者不相同;Image的影像是在记忆体中、看不见的影像,这看不见的影像 对映着我们在萤上看见的影像(我们见到的是Picture物件之影像)。也就是说一共有两份 影像,一份在记体看不见的(Image),另一份看得见(Picture)。而AutoRedraw是作为切 换这二者之机制,当AutoRedraw设为False时,在上面的绘图会影响Picture,而且会立 刻让我们看到绘图的果结果,此时Form/PictureBox的hdc是Picture的Device Context Handle。而AutoRedraw设为true时,所有绘图动作是在Image上做的,所以我们发现屏幕 上没有绘图之变化,而此时Form/PictureBox的hdc是Image的Device Context Handle(如 果您在AutoRedraw为true与False时各别列印hdc来看,两个hdc的值会不相同),而画面 上的变化是直到我们用Refresh指令时,才见得着。事实上Refresh 的指令做了以下的动 作: Set Obj.Picture = Obj.Image (Obj为Form或PictureBox);即使用看不见的那份 Image影像来覆盖Picture的影像。 这有什麽用呢?当我们使用Set Form1.Picture = LoadPicture("mypic.bmp") 後,这 mypic.bmp会同时指定给Form1的Image与Picture,而我们如果在AutoRedraw=False的情 况下绘图,所有的绘图会立刻显示,下个Refresh则所有方才的绘图会被Image的影像所 还原,因Image内的影像和Picture未绘图前的影像相同,所以好像图又回复原状了。相 对的,如果们想画一个图,而画的步骤有好几步,如果希望全部画完後才一口气显示, 那麽,就只有设AutoRedraw为True,那所有的绘图都针对Image来做,不会显示于画面, 当全画好了,就下一个Refresh的指令,就把Image的影像Copy到Picture上,而我们就能 见着啦。另外,我们如果绘图于Picture上(非Image上,即设AutoRedraw = False),当 有其他的Window盖住我们的Window,而後再移开时,会发现方才的绘图不见了,相反的 当AutoRedraw设为True时,不管是Resize或重新Paint,都会拿记忆体的那份图来画, 所以别的Window移开时,我们Window上的绘图都还在,没有消失(所以这才叫AutoRedraw)