強制和防止窗口重畫
發表于:2007-07-14來源:作者:點擊數:
標簽:
這個例子告訴你如何強制窗口的一部分重畫。有時這是必須的,特別是當你試驗自己重畫控件的技術,或者已經使用了LockWindowUpdate 這個API函數以阻止控件重畫時(參見“防止一個窗口重畫”)。 新建一個項目,添加一個module,然后粘貼下列代碼: Private Typ
這個例子告訴你如何強制窗口的一部分重畫。有時這是必須的,特別是當你試驗自己重畫控件的技術,或者已經使用了LockWindowUpdate
這個API函數以阻止控件重畫時(參見“防止一個窗口重畫”)。
新建一個項目,添加一個module,然后粘貼下列代碼:
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Declare Function InvalidateRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT, ByVal bErase As Long) As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
Public Sub RepaintWindow(ByRef objThis As Object, Optional ByVal bClientAreaOnly As Boolean = True)
Dim tR As RECT
Dim tP As POINTAPI
If (bClientAreaOnly) Then
GetClientRect objThis.hWnd, tR
Else
GetWindowRect objThis.hWnd, tR
tP.X = tR.Left: tP.Y = tR.Top
ScreenToClient objThis.hWnd, tP
tR.Left = tP.X: tR.Top = tP.Y
tP.X = tR.Right: tP.Y = tR.Bottom
ScreenToClient objThis.hWnd, tP
tR.Right = tP.X: tR.Bottom = tP.Y
End If
InvalidateRect objThis.hWnd, tR, 1
End Sub
為了試試重畫,在窗體上添加一個ListBox和一個Command。把ListBox拉得大一些,這樣效果比較明顯。再加入下列代碼:
Private Sub Command1_Click()
RepaintWindow List1
End Sub
Private Sub Form_Load()
Dim i As Long
For i = 1 To 200
List1.AddItem "TestItem " & i
Next i
End Sub
當你單擊Command按鈕,ListBox的客戶區將全部重畫。對于ListBox,這種效果并不十分明顯地顯示,但這段代碼放在這里主要目的,是讓你在
遇上有東西不能恰當地重畫它自己時可以有辦法解決。
——————————————————————————————————————————————
防止窗口重畫 WXJ_Lake 編譯
這則代碼演示了如何防止窗口的一部分重畫。當你要往ListBox或ListView這樣的控件里添加許多項時,暫緩重畫可以相當地提高處理速度。
在我的系統上,往一個ListBox中加10000項比原來提速30%
新建一個項目,添加一個ListBox、一個Command和一個CheckBox。把CheckBox的Caption設為"&Lock Update",Command的Caption設為"&Load"。
然后,把下列代碼粘貼到窗體中:
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Private Sub Command1_Click()
Dim i As Long
Dim lTIme As Long
lTIme = timeGetTime()
If (Check1.Value = Checked) Then
LockWindowUpdate List1.hWnd
End If
List1.Clear
For i = 1 To 10000
List1.AddItem "Test " & i
Next i
If (Check1.Value = Checked) Then
LockWindowUpdate 0
List1.Refresh
End If
MsgBox "Time: " & timeGetTime - lTIme
End Sub
當你單擊Command按鈕,代碼將往ListBox中添加10000項。如果"Lock Update"的復選框被選中,
Windows將在往ListBox中添加項時防止它的重畫。操作結束后,會彈出一個對話框報告運行時間。
原文轉自:http://www.anti-gravitydesign.com