1. CListCtrl 風格
LVS_ICON: 爲每個item顯示大圖標
LVS_SMALLICON: 爲每個item顯示小圖標
LVS_LIST: 顯示一列帶有小圖標的item
LVS_REPORT: 顯示item詳細資料
直觀的理解:windows資源管理器,“查看”標籤下的“大圖標,小圖標,列表,詳細資料”
2. 設置listctrl 風格及擴展風格
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceshellui5/html/wce50lrflistviewstyles.asp
3. 插入數據
m_list.InsertColumn(
0, "ID" ,
LVCFMT_LEFT, 40 ); //插入列 m_list.InsertColumn(
1, "NAME" ,
LVCFMT_LEFT, 50 ); int nRow
= m_list.InsertItem(0, “11”); //插入行 m_list.SetItemText(nRow,
1, “jacky”); //設置數據 |
4. 一直選中item
選中style中的Show selection always,或者在上面第2點中設置LVS_SHOWSELALWAYS5. 選中和取消選中一行
int nIndex
= 0; //選中 m_list.SetItemState(nIndex,
LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); //取消選中 m_list.SetItemState(nIndex,
0, LVIS_SELECTED|LVIS_FOCUSED); |
6. 得到listctrl中所有行的checkbox的狀態
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES); CString
str; for ( int i=0;
i<m_list.GetItemCount(); i++) { if (
m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i)) { str.Format(_T( "第%d行的checkbox爲選中狀態" ),
i); AfxMessageBox(str); } } |
7. 得到listctrl中所有選中行的序號
方法一:
CString
str; for ( int i=0;
i<m_list.GetItemCount(); i++) { if (
m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ) { str.Format(_T( "選中了第%d行" ),
i); AfxMessageBox(str); } } |
方法二:
POSITION
pos = m_list.GetFirstSelectedItemPosition(); if (pos
== NULL) TRACE0( "No
items were selected!\n" ); else { while (pos) { int nItem
= m_list.GetNextSelectedItem(pos); TRACE1( "Item
%d was selected!\n" ,
nItem); //
you could do your own processing on nItem here } } |
8. 得到item的信息
TCHAR szBuf[1024]; LVITEM
lvi; lvi.iItem
= nItemIndex; lvi.iSubItem
= 0; lvi.mask
= LVIF_TEXT; lvi.pszText
= szBuf; lvi.cchTextMax
= 1024; m_list.GetItem(&lvi); |
關於得到設置item的狀態,還可以參考msdn文章
Q173242: Use Masks to Set/Get Item States in CListCtrl
http://support.microsoft.com/kb/173242/en-us
9. 得到listctrl的所有列的header字符串內容
LVCOLUMN
lvcol; char str[256]; int nColNum; CString
strColumnName[4]; //假如有4列 nColNum
= 0; lvcol.mask
= LVCF_TEXT; lvcol.pszText
= str; lvcol.cchTextMax
= 256; while (m_list.GetColumn(nColNum,
&lvcol)) {
strColumnName[nColNum]
= lvcol.pszText; nColNum++; } |
10. 使listctrl中一項可見,即滾動滾動條
m_list.EnsureVisible(i, FALSE);11. 得到listctrl列數
GetItemCount函數12. 刪除所有列
方法一:
while ( m_list.DeleteColumn (0))
因爲你刪除了第一列後,後面的列會依次向上移動。
方法二:
int nColumns = 4;
for (int i=nColumns-1; i>=0; i--)
m_list.DeleteColumn (i);
13. 得到單擊的listctrl的行列號
添加listctrl控件的NM_CLICK消息相應函數
void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// 方法一:
LVCOLUMN
lvcol; char str[256]; int nColNum; CString
strColumnName[4]; //假如有4列 nColNum
= 0; lvcol.mask
= LVCF_TEXT; lvcol.pszText
= str; lvcol.cchTextMax
= 256; while (m_list.GetColumn(nColNum,
&lvcol)) {
strColumnName[nColNum]
= lvcol.pszText; nColNum++; } |
// 方法二:
NM_LISTVIEW*
pNMListView = (NM_LISTVIEW*)pNMHDR; if (pNMListView->iItem
!= -1) { CString
strtemp; strtemp.Format( "單擊的是第%d行第%d列" , pNMListView->iItem,
pNMListView->iSubItem); AfxMessageBox(strtemp); } *pResult
= 0; |
}
14. 判斷是否點擊在listctrl的checkbox上
添加listctrl控件的NM_CLICK消息相應函數
void CTest6Dlg::OnClickList1(NMHDR*
pNMHDR, LRESULT *
pResult) { DWORD dwPos
= GetMessagePos(); CPoint
point( LOWORD(dwPos), HIWORD(dwPos) ); m_list.ScreenToClient(&point); LVHITTESTINFO
lvinfo; lvinfo.pt
= point; lvinfo.flags
= LVHT_ABOVE; UINT nFlag; int nItem
= m_list.HitTest(point, &nFlag); //判斷是否點在checkbox上 if (nFlag
== LVHT_ONITEMSTATEICON) { AfxMessageBox( "點在listctrl的checkbox上" ); }
*pResult
= 0; } |
15. 右鍵點擊listctrl的item彈出菜單
添加listctrl控件的NM_RCLICK消息相應函數
void CTest6Dlg::OnRclickList1(NMHDR*
pNMHDR, LRESULT *
pResult) { NM_LISTVIEW*
pNMListView = (NM_LISTVIEW*)pNMHDR; if (pNMListView->iItem
!= -1) { DWORD dwPos
= GetMessagePos(); CPoint
point( LOWORD(dwPos), HIWORD(dwPos) ); CMenu
menu; VERIFY(
menu.LoadMenu( IDR_MENU1 ) ); CMenu*
popup = menu.GetSubMenu(0); ASSERT(
popup != NULL ); popup->TrackPopupMenu(TPM_LEFTALIGN
| TPM_RIGHTBUTTON, point.x, point.y, this ); }
*pResult
= 0; } |
16. item切換焦點時(包括用鍵盤和鼠標切換item時),狀態的一些變化順序
添加listctrl控件的LVN_ITEMCHANGED消息相應函數
void CTest6Dlg::OnItemchangedList1(NMHDR*
pNMHDR, LRESULT *
pResult) { NM_LISTVIEW*
pNMListView = (NM_LISTVIEW*)pNMHDR; //
TODO: Add your control notification handler code here CString
sTemp; if ((pNMListView->uOldState
& LVIS_FOCUSED) == LVIS_FOCUSED && (pNMListView->uNewState
& LVIS_FOCUSED) == 0) { sTemp.Format( "%d
losted focus" ,pNMListView->iItem); } else if ((pNMListView->uOldState
& LVIS_FOCUSED) == 0 && (pNMListView->uNewState
& LVIS_FOCUSED) == LVIS_FOCUSED) { sTemp.Format( "%d
got focus" ,pNMListView->iItem); }
if ((pNMListView->uOldState
& LVIS_SELECTED) == LVIS_SELECTED && (pNMListView->uNewState
& LVIS_SELECTED) == 0) { sTemp.Format( "%d
losted selected" ,pNMListView->iItem); } else if ((pNMListView->uOldState
& LVIS_SELECTED) == 0 && (pNMListView->uNewState
& LVIS_SELECTED) == LVIS_SELECTED) { sTemp.Format( "%d
got selected" ,pNMListView->iItem); } *pResult
= 0; } |
17. 得到另一個進程裏的listctrl控件的item內容
http://www.codeproject.com/threads/int64_memsteal.asp
18. 選中listview中的item
Q131284: How To Select a Listview Item Programmaticallyhttp://support.microsoft.com/kb/131284/en-us
19. 如何在CListView中使用CListCtrl的派生類
http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/
20. listctrl的subitem添加圖標
m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);
m_list.SetItem(..); //具體參數請參考msdn
21. 在CListCtrl顯示文件,並根據文件類型來顯示圖標
網上找到的代碼,share
22. listctrl內容進行大數據量更新時,避免閃爍
或者參考
23. listctrl排序
Q250614:How To Sort Items in a CListCtrl in Report View
http://support.microsoft.com/kb/250614/en-us
24. 在listctrl中選中某個item時動態改變其icon或bitmap
Q141834: How to change the icon or the bitmap of a CListCtrl item in Visual C++http://support.microsoft.com/kb/141834/en-us
25. 在添加item後,再InsertColumn()後導致整列數據移動的問題
Q151897: CListCtrl::InsertColumn() Causes Column Data to Shift
http://support.microsoft.com/kb/151897/en-us
26. 關於listctrl第一列始終居左的問題
解決辦法:把第一列當一個虛列,從第二列開始插入列及數據,最後刪除第一列。
具體解釋參閱 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/listview/structures/lvcolumn.asp
27. 鎖定column header的拖動
http://msdn.microsoft.com/msdnmag/issues/03/06/CQA/
28. 如何隱藏clistctrl的列
把需隱藏的列的寬度設爲0,然後檢測當該列爲隱藏列時,用上面第27點的鎖定column 的拖動來實現
29. listctrl進行大數據量操作時,使用virtual list
http://www.codeguru.com/cpp/controls/listview/advanced/article.php/c4151/
http://www.codeproject.com/listctrl/virtuallist.asp
30. 關於item只能顯示259個字符的問題
解決辦法:需要在item上放一個edit。
31. 響應在listctrl的column header上的鼠標右鍵單擊
Q125694: How To Find Out Which Listview Column Was Right-Clicked
http://support.microsoft.com/kb/125694/en-us
32. 類似於windows資源管理器的listview
Q234310: How to implement a ListView control that is similar to Windows Explorer by using DirLV.exe
http://support.microsoft.com/kb/234310/en-us
33. 在ListCtrl中OnTimer只響應兩次的問題
Q200054:
PRB: OnTimer() Is Not Called Repeatedly for a List Control
http://support.microsoft.com/kb/200054/en-us
34. 以下爲一些爲實現各種自定義功能的listctrl派生類
(1) 拖放
http://www.codeproject.com/listctrl/dragtest.asp
在CListCtrl和CTreeCtrl間拖放
http://support.microsoft.com/kb/148738/en-us
(2) 多功能listctrl
支持subitem可編輯,圖標,radiobutton,checkbox,字符串改變顏色的類
http://www.codeproject.com/listctrl/quicklist.asp
支持排序,subitem可編輯,subitem圖標,subitem改變顏色的類
http://www.codeproject.com/listctrl/ReportControl.asp
(3) subitem中顯示超鏈接
http://www.codeproject.com/listctrl/CListCtrlLink.asp
(4) subitem的tooltip提示
http://www.codeproject.com/listctrl/ctooltiplistctrl.asp
(5) subitem中顯示進度條
http://www.codeproject.com/listctrl/ProgressListControl.asp
http://www.codeproject.com/listctrl/napster.asp
http://www.codeguru.com/Cpp/controls/listview/article.php/c4187/
(6) 動態改變subitem的顏色和背景色
http://www.codeproject.com/listctrl/highlightlistctrl.asp
http://www.codeguru.com/Cpp/controls/listbox/colorlistboxes/article.php/c4757/
(7) 類vb屬性對話框
http://www.codeproject.com/listctrl/propertylistctrl.asp
http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c995/
http://www.codeguru.com/Cpp/controls/listview/propertylists/article.php/c1041/
(8) 選中subitem(只高亮選中的item)
http://www.codeproject.com/listctrl/SubItemSel.asp
http://www.codeproject.com/listctrl/ListSubItSel.asp
(9) 改變行高
http://www.codeproject.com/listctrl/changerowheight.asp
(10) 改變行顏色
http://www.codeproject.com/listctrl/coloredlistctrl.asp
(11) 可編輯subitem的listctrl
http://www.codeproject.com/listctrl/nirs2000.asp
http://www.codeproject.com/listctrl/editing_subitems_in_listcontrol.asp
(12) subitem可編輯,插入combobox,改變行顏色,subitem的tooltip提示
http://www.codeproject.com/listctrl/reusablelistcontrol.asp
(13) header 中允許多行字符串
http://www.codeproject.com/listctrl/headerctrlex.asp
(14) 插入combobox
http://www.codeguru.com/Cpp/controls/listview/editingitemsandsubitem/article.php/c979/
(15) 添加背景圖片
http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c4173/
http://www.codeguru.com/Cpp/controls/listview/backgroundcolorandimage/article.php/c983/
http://www.vchelp.net/vchelp/archive.asp?type_id=9&class_id=1&cata_id=1&article_id=1088&search_term=
(16) 自適應寬度的listctrl
http://www.codeproject.com/useritems/AutosizeListCtrl.asp
處理
NM_CUSTOMDRAW