關於控件Paint時的一些體會

     最近在把以前的一個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+的小程序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章