AutoRedraw與Image/Picture屬性的關聯
來源: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)