資源描述:
《[訓(xùn)練]用api函數(shù)改進(jìn)listview控件的顯示效果》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、用API函數(shù)改進(jìn)ListView控件的顯示效果作者:王建兵文章來(lái)源:轉(zhuǎn)帖點(diǎn)擊數(shù):1292更新時(shí)間:12/18/2()03一、ListView使用簡(jiǎn)介-…ListView控件是VB開發(fā)者非常喜愛的控件之.一。作為Windows95公共控件組(COMCTL32.OCX)的成員,它經(jīng)常與經(jīng)常與TreeView.ImageList等控件聯(lián)合使用。即用TreeView顯示一個(gè)的樹和結(jié)構(gòu),而用ListView顯示選中的節(jié)點(diǎn)(Node)對(duì)彖的記錄集。--這是筆者在開發(fā)財(cái)務(wù)軟件項(xiàng)目中的《憑證管理>>模塊的一個(gè)用戶界面。屏幕左邊是
2、一個(gè)TreeView控件,用來(lái)顯示會(huì)計(jì)憑證的類別:右邊是一個(gè)istView,用來(lái)顯示對(duì)應(yīng)類別的憑證H錄;上方是一個(gè)菜單條控件(MenuBar)和一個(gè)工具條控件(ToolBar);下方是一個(gè)狀態(tài)欄控件(StatusBar),用來(lái)顯示憑證數(shù)個(gè)當(dāng)前日期。--大家可以看到圖中所示的界而非常類似于Window95/98的資源瀏覽器,Windows的界面風(fēng)格做為一種標(biāo)準(zhǔn)己為廣大用戶所接受。而Windows操作系統(tǒng)的主要的優(yōu)點(diǎn)就是為所有的應(yīng)用程序提供了公用的界面。知道如何使用基于Windows的應(yīng)用程序的用戶,很容易學(xué)會(huì)使用其
3、他應(yīng)用程序。這種使用Windows95公共控件紐合的方法能夠達(dá)到與Windows界而的一致性,所以在目前VB5.0應(yīng)用程序的開發(fā)中經(jīng)常使用。二、填充人量結(jié)果集所遇到的問(wèn)題--在實(shí)際應(yīng)用開發(fā)中,經(jīng)常用ListView填充一個(gè)數(shù)據(jù)庫(kù)結(jié)果集(Recordset)的內(nèi)容。即先寫一段SQL查詢語(yǔ)旬,產(chǎn)生一個(gè)結(jié)果集,然后將結(jié)果集的每一條記錄用DO...LOOP循環(huán)語(yǔ)句中填到ListView屮。--但是當(dāng)結(jié)果集很大時(shí)(例如冇5000條以上的記錄),填充所需要的時(shí)間會(huì)很長(zhǎng)。用戶不得不等很長(zhǎng)時(shí)間完成一個(gè)查詢。所以在查詢的過(guò)程小必須
4、允許用戶按Escape鍵退出。具體做法是在DO...LOOP循壞體中加一條DoEvents函數(shù),并寫一段中斷退出程序代碼。--DoEvents函數(shù)的功能是:轉(zhuǎn)止控制權(quán),以便讓操作系統(tǒng)處理其它的事件。這樣在長(zhǎng)時(shí)間的查詢過(guò)程中,如果用戶按了Escape鍵,將退出循壞體,結(jié)束查詢過(guò)程。--但是這樣又會(huì)引發(fā)另外一個(gè)問(wèn)題:由于DoEvents可以讓操作系統(tǒng)響應(yīng)別的事件,循環(huán)體中填充每一條ListView項(xiàng)S(Listitem)的過(guò)程也會(huì)顯示til來(lái),所以在填充的過(guò)程中屏幕會(huì)不停的閃動(dòng),這種現(xiàn)象當(dāng)然不能被用戶所接受。如何解決
5、這個(gè)問(wèn)題呢?三、解決方案--用WindowsAPI兩數(shù)可以解決這個(gè)問(wèn)題。首先對(duì)幾個(gè)用到的API兩數(shù)做一解釋和說(shuō)明?!?.GetClientRectLib"user32"(ByVaihwndAsLong,IpRectAsRECT)AsLong--此函數(shù)的功能是獲得一個(gè)指定對(duì)象窗□(Window)的矩型框區(qū)?(rectangle)o--Hwnd為指定對(duì)象或窗體的句柄。LpRcct為返回矩型框的結(jié)構(gòu)(必須定義為結(jié)構(gòu)類型的變量)。----2.ValidateRectLib"user32"(ByVaihwndAsLong
6、,IpRectAsRECT)AsLong一此函數(shù)的功能是使指定的矩型區(qū)域生效。這樣會(huì)通知Windows不必對(duì)指定的區(qū)域進(jìn)行重畫(Redraw)?!?.InvalidateRectLib"user32"(ByVaihwndAsLx)ng,IpRectAsRECT,ByValbEraseAsLong)AsLong■…此函數(shù)的功能是使指定的矩型區(qū)域無(wú)效。這樣會(huì)通知Windows耍對(duì)指定的區(qū)域進(jìn)行重畫。--具體實(shí)現(xiàn)的步驟如下:■…1.在填充結(jié)果集之前先用GetClientRect函數(shù)獲得ListView的顯示區(qū)域?!?
7、2.在増加完一個(gè)顯示項(xiàng)S(Listitem)后用ValidateRect函數(shù)置這一區(qū)域?yàn)橛行?。這樣Windows就不會(huì)顯示每一條Listitem.屏幕閃動(dòng)的現(xiàn)象就會(huì)消失。-…3.在填充結(jié)果集之.后,用InvalidateRect*
8、數(shù)置這一區(qū)域?yàn)闊o(wú)效。這樣Windows就會(huì)重畫ListView的內(nèi)容,結(jié)果集被完整的顯示來(lái)。--下面是筆者在項(xiàng)目開發(fā)中的一個(gè)程序?qū)嵗?。程序名為刖ListView。該程序?qū)⑻顚懸粋€(gè)Access數(shù)據(jù)庫(kù)(FISCAL.MDB)的憑證表(Tabic)的內(nèi)容到ListView中。-…首先進(jìn)入VB
9、5.0,新建一個(gè)窗體(Form),名為Formlo然后在Form中增加下列控件??丶鸑ameListViewLvwImagelistimlListCommandButton。Command1-…將ImageList控件中充填一個(gè)名為“item”的圖象后與ListView控件關(guān)聯(lián)?!趘vT程>>菜單命令條屮進(jìn)入"引用”對(duì)話框,選擇"MicrosoftDAOObject