最近在把以前的一個MFC控件轉移到dotNet上。在寫Paint事件時需要使用大量大幅的圖片的合成、動態GIF、描邊字,半透明陰影等。這是我第一次大量接觸GDI+,感覺的確比傳統GDI要強大好多。但畢竟是剛剛接觸,在使用中也遇到了不少的麻煩。特此在這裏慢慢總結一下,留個紀念,以便以後的的查閱。如有不對之處還望見諒並指出。
1、關於雙緩衝
由於有大量的大幅圖片的合成和藝術字體的繪製,如果直接在Paint裏繪製按以前MFC的經驗肯定要刷屏的。那麼條件反射就是要用雙緩衝。察看Framework的SDK,沒有明確的提到。沒辦法,只好自己摸索。現在的我得到的辦法是用。
建立全局變量 Dim bufBitmap as Bitmap Dim BufG as Graphics 用於雙緩衝使用
在Form_Load時 建立等同於窗體或控件大小的Bitmap緩衝: eg: bufBitmap = new BitMap(me.width,me.heigh)
在Form_ReSize時 跟新bufBitmap的大小
eg: bufBitmap.dispose()
bufBitmap = Nothing
bufBitmap = new BitMap(me.width,me.heigh)
在Form_Paint時 根據bufBitmap 建立容器 BufG = Graphics.FromImage(imageFile)
接着在BufG上繪製所有的圖形,最有 在窗口或空間自己的Graphics.DrawImage(bufBitmap,0,0)
2、關於即使使用雙緩重也會發生刷屏的問題
原本以爲使用了雙緩衝就沒有刷屏了,沒想到在快速的更新控件時還是發生了刷屏的問題。
怎麼回事? 啊!忘了。原來在MFC時,還要終止Form的背景擦除事件。可是一開始沒在Form的事件
裏找到這個事件。難道是微軟忘了?不太可能。繼續找........... 結果找到了。原來微軟把背景擦除事件作爲Overrides了。完整的SDK描述是
Protected Overridable Sub OnPaintBackground( _
ByVal pevent As PaintEventArgs _
)
現在只要實現該Overridable 不要在事件裏填寫任何代碼,就屏蔽了背景擦除事件。對!就這麼簡單
還有,查找過程中我找到了一個超有用的事件
Protected Overridable Sub WndProc( _
ByRef m As Message _
)
可能直接從C#等語言開始寫程序的人並不瞭解這個函數,但只要寫過純C或MFC Win32的人一定會對它很親切的.
今天就寫到這裏,其他的一些想法,以後慢慢在補.歡迎大家一起討論.
附: 一個練習GDI+的小程序.還沒有完全完成.(春麗GiF動畫會跟隨鼠標,完全GDI+繪製所用界面)
下載: GDI+的小程序