程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 強制和防止窗口重畫

強制和防止窗口重畫

編輯:VB綜合教程
這個例子告訴你如何強制窗口的一部分重畫。有時這是必須的,特別是當你試驗自己重畫控件的技術,或者已經使用了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中添加項時防止它的重畫。操作結束後,會彈出一個對話框報告運行時間。->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved