Virtual List的使用方法

2021-06-04 19:33:35 字數 1821 閱讀 4964

virtual list(虛擬列表)是lvs_ownerdata 樣式的list ctrl.預設的list ctrl在插入大量的資料時會變得很慢.在我的破機器上插入不到一萬行的資料要幾十秒,非常令人不爽.而用virtual list可以大大加快速度。virtual list不擁有資料,當需要顯示一行時才發訊息向父視窗查詢顯示內容。virtual list的使用方法與普通list ctrl稍微有點不同。它有三個重要的訊息lvn_getdispinfo,lvn_odcachehint和 lvn_odfinditem。響應這三個訊息是關鍵。

1.建立virtual list

只需新增lvs_ownerdata風格到list ctrl就行了。

m_list.setextendedstyle(lvs_ex_fullrowselect|lvs_ownerdata);

2.新增,刪除和更改一行

新增:因為virtual list不擁有資料,資料存在外部(如:資料庫),所以你只需將資料新增到外部,然後m_list.setitemcount(list_size+1)告訴virtual list行數加一。這樣virtual list會更改滾動條的樣子,以便看上去新增了一行.

刪除:先在外部資料中刪除行,然後m_list.setitemcount(list_size-1)更改滾動條.

更改:直接修改在外部資料中的行.

如果這些行是正在顯示的行,則需要呼叫m_list.redrawitems(nfirst,nlast)

3.響應lvn_getdispinfo訊息

當virtual list需要顯示一行資料時,它傳送這個訊息給父視窗詢問資料內容.父視窗收到訊息後從傳過來引數中知道virtual list現在顯示的是第幾項,第幾列,內容是什麼型別.然後父視窗在外部資料中找到資料內容,將它返回給virtual list.

先新增訊息對映,這裡用的是反射訊息,可以減少控制項于父視窗之間的耦合度

begin_message_map(cmylistctrl, clistctrl)

on_notify_reflect(lvn_getdispinfo, ongetdispinfo)

end_message_map()

相應的響應函式

void cmylistctrl::ongetdispinfo(nmhdr* pnmhdr, lresult* presult) 

break;

case 1:

break;}}

*presult = 0;

}4.響應lvn_odcachehint訊息

這個訊息用來快取請求項的資料.我沒用到這個訊息,因為我已一次將所有資料讀入記憶體.

5.響應lvn_odfinditem訊息

在資源管理器中瀏覽檔案時,讓焦點list上,然後在鍵盤上輸入檔名.資源管理器會自動找到並選中與之最相近的檔案.lvn_odfinditem就是實現這個功能的.當焦點在list上時,按鍵操作會使virtual list傳送lvn_odfinditem給父視窗.父視窗找到相應項並將它選中.

begin_message_map(cmylistctrl, clistctrl)

on_notify_reflect(lvn_odfinditem, onodfinditemlist)

end_message_map()

void cmylistctrl::onodfinditemlist(nmhdr* pnmhdr, lresult* presult) 

currentpos++;

if(currentpos >= m_list.getitemcount())

currentpos = 0;

}while(currentpos != startpos);  

}

Virtual List的使用方法

virtual list 虛擬列表 是lvs ownerdata 樣式的list ctrl.預設的list ctrl在插入大量的資料時會變得很慢.在我的破機器上插入不到一萬行的資料要幾十秒,非常令人不爽.而用virtual list可以大大加快速度。virtual list不擁有資料,當需要顯示一行...

iOS MBProgressHUD的使用方法

mbprogresshud就是乙個非常好用的第三方庫,可以快速接入載入的介面,下面貼 下面的 包含了各種常用型別的載入 import viewcontroller.h import mbprogresshud.h inte ce viewcontroller property atomic,assi...

dbms output put line使用方法

begin dbms output.put line a end 如果你是再sql plus中,只要再環境中打出 set serveroutput on 就可以了.還有一種方法 就是使用環境中的繫結變數也可以.再環境中定義 variable name varchar2 50 然後把過程新增乙個out...