可以代替窗體Refresh方法的函數

VB中打開AutoRedraw可方便的建立雙緩衝,利用API在後臺繪圖,最後一次性整體更新到前臺,實現穩定無閃爍的動畫效果,一般情況下,VB會自動進行後臺到前臺的刷新,這主要有兩種情況:
1、收到WM_PAIT消息
2、代碼調用Refresh方法

能讓VB收到WM_PAIT消息的情況主要有
1、窗體被遮蓋或隱藏後重現
2、調用任何VB內部的圖形方法,包括PaintPicture、Print、Cls、Line、Circle、Pset
3、調用一些與圖形方法有關的特殊方法,如:Point、TextWidth、TextHeight

可見讓VB自動更新的機會是很多的,也許我們可以不必關心前臺更新的問題,但有此類設計經驗的朋友,一定注意到了:如果繪圖中沒有用到任何VB自己的圖形方法,採用純API繪圖,或者做一個連續動畫,又不便插入Doevents時,前臺會得不到更新。這樣我們繪了半天,卻沒看到內容。
Form及PictureBox都有Refresh方法就是爲了解決這種情況而設計的,不過,Refresh方法有時會覺得比較浪費,例如,做一個物體移動動畫時,只是不斷繪製物體相關的一小塊區域,可Refresh方法不管你在後臺改寫了多少內容,哪怕只是很小一塊區域,它也是整個客戶區的整體重繪,這種速度自然會慢下來。

下面這個函數就是爲代替Refresh方法而寫的,在全區刷新時,它比Refresh方法略快一點,但若用於局部刷新,它就會快很多很多了。
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long

Public Sub BoxRefresh(dhwd As Long, dHdc As Long, X As Long, y As Long, w As Long, h As Long)
    Dim fdc As Long
    fdc = GetDC(dhwd)
    BitBlt fdc, X, y, w, h, dHdc, X, y, vbSrcCopy
    ReleaseDC dhwd, fdc
End Sub

我的機器上1024*768*32時窗體最大化,用Refresh方法3000次,用時需8秒多,但若只更新100X100的區域,Refresh方法能做的還是全屏更新,用上面的BoxRefresh,只需78毫秒。

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