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...