強制和防止窗口重畫

發表于: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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97