這個例子告訴你如何強制窗口的一部分重畫。有時這是必須的,特別是當你試驗自己重畫控件的技術,或者已經使用了LockWindowUpdate
這個API函數以阻止控件重畫時(參見“防止一個窗口重畫”)。
新建一個項目,添加一個module,然後粘貼下列代碼:
PrivateTypeRECT
LeftAsLong
TopAsLong
RightAsLong
BottomAsLong
EndType
PrivateTypePOINTAPI
XAsLong
YAsLong
EndType
PrivateDeclareFunctionGetWindowRectLib"user32"(ByValhWndAsLong,lpRectAsRECT)AsLong
PrivateDeclareFunctionGetClientRectLib"user32"(ByValhWndAsLong,lpRectAsRECT)AsLong
PrivateDeclareFunctionInvalidateRectLib"user32"(ByValhWndAsLong,lpRectAsRECT,ByValbEraseAsLong)AsLong
PrivateDeclareFunctionScreenToClientLib"user32"(ByValhWndAsLong,lpPointAsPOINTAPI)AsLong
PublicSubRepaintWindow(ByRefobjThisAsObject,OptionalByValbClientAreaOnlyAsBoolean=True)
DimtRAsRECT
DimtPAsPOINTAPI
If(bClientAreaOnly)Then
GetClientRectobjThis.hWnd,tR
Else
GetWindowRectobjThis.hWnd,tR
tP.X=tR.Left:tP.Y=tR.Top
ScreenToClientobjThis.hWnd,tP
tR.Left=tP.X:tR.Top=tP.Y
tP.X=tR.Right:tP.Y=tR.Bottom
ScreenToClientobjThis.hWnd,tP
tR.Right=tP.X:tR.Bottom=tP.Y
EndIf
InvalidateRectobjThis.hWnd,tR,1
EndSub
為了試試重畫,在窗體上添加一個ListBox和一個Command。把ListBox拉得大一些,這樣效果比較明顯。再加入下列代碼:
PrivateSubCommand1_Click()
RepaintWindowList1
EndSub
PrivateSubForm_Load()
DimiAsLong
Fori=1To200
List1.AddItem"TestItem"&i
Nexti
EndSub
當你單擊Command按鈕,ListBox的客戶區將全部重畫。對於ListBox,這種效果並不十分明顯地顯示,但這段代碼放在這裡主要目的,是讓你在
遇上有東西不能恰當地重畫它自己時可以有辦法解決。
——————————————————————————————————————————————
防止窗口重畫 WXJ_Lake編譯
這則代碼演示了如何防止窗口的一部分重畫。當你要往ListBox或ListView這樣的控件裡添加許多項時,暫緩重畫可以相當地提高處理速度。
在我的系統上,往一個ListBox中加10000項比原來提速30
新建一個項目,添加一個ListBox、一個Command和一個CheckBox。把CheckBox的Caption設為"&LockUpdate",Command的Caption設為"&Load"。
然後,把下列代碼粘貼到窗體中:
PrivateDeclareFunctionLockWindowUpdateLib"user32"(ByValhwndLockAsLong)AsLong
PrivateDeclareFunctiontimeGetTimeLib"winmm.dll"()AsLong
PrivateSubCommand1_Click()
DimiAsLong
DimlTImeAsLong
lTIme=timeGetTime()
If(Check1.Value=Checked)Then
LockWindowUpdateList1.hWnd
EndIf
List1.Clear
Fori=1To10000
List1.AddItem"Test"&i
Nexti
If(Check1.Value=Checked)Then
LockWindowUpdate0
List1.Refresh
EndIf
MsgBox"Time:"&timeGetTime-lTIme
EndSub
當你單擊Command按鈕,代碼將往ListBox中添加10000項。如果"LockUpdate"的復選框被選中,Windows將在往ListBox中添加項時防止它的重畫。操作結束後,會彈出一個對話框報告運行時間。->