1.ListCtrl樣式
LVS圖標:為每個項目顯示壹個大圖標。
LVS_SMALLICON:為每個項目顯示壹個小圖標。
LVS列表:用小圖標顯示項目列表。
LVS _報表:顯示項目詳細信息。
直觀理解:windows資源管理器中,“查看”選項卡下的“大圖標、小圖標、列表、詳細信息”。
-
2.設置listctrl樣式和擴展樣式。
長lStyle
lStyle = GetWindowLong(m _ list . m _ hWnd,GWL _ STYLE);//獲取當前窗口樣式
lStyle & amp= ~ LVS _類型掩碼;//清除顯示模式位
lStyle |= LVS報告;//設置樣式
SetWindowLong(m _ list . m _ hWnd,GWL_STYLE,l STYLE);//設置樣式
DWORD dwStyle = m_list。GetExtendedStyle();
dw style | = LVS _ EX _ FULLROWSELECT;//選擇壹個以高亮顯示整行(僅適用於報表樣式的listctrl)
dw style | = LVS _ EX _ GRIDLINES;//網格線(僅適用於報表樣式的listctrl)
dw style | = LVS _ EX _復選框;//在//項目前生成復選框控件。
m_list。SetExtendedStyle(dw style);//設置擴展樣式
-
插入數據
m_list。insert column(0,“ID”,LVCFMT_LEFT,40);//插入列
m_list。insert column(1,“NAME“,LVCFMT_LEFT,50);
int nRow = m_list。insert item(0,“11“);//插入行
m_list。SetItemText(nRow,1,“Jacky“);//設置數據
-
4.保持項目選中。
選擇“始終以樣式顯示選定內容”,或在上面的第2點中設置“LVS _顯示始終”。
-
5.選中和取消選中壹行。
int nIndex = 0;
//已選擇
m_list。SetItemState(nIndex,LVIS選定|LVIS聚焦,LVIS選定|LVIS聚焦);
//取消選中
m_list。SetItemState(nIndex,0,LVIS _選定| LVIS _聚焦);
-
6.獲取listctrl中所有行的復選框狀態。
m_list。SetExtendedStyle(LVS復選框);
CString字符串;
for(int I = 0;我& ltm_list。GetItemCount();我)
{
if(m _ list。GetItemState(I,LVIS _選定)= = LVIS _選定|| m_list。get check(I))
{
海峽。format(_ T(“第%d行的復選框被選中”),I);
AfxMessageBox(str);
}
}
CString字符串;
strIns =“delete from tmpStatByGround“;
m_pRs。create instance(_ _ uuidof(Recordset));
m _ pRs-& gt;CursorLocation = adUseClient
m _ pRs-& gt;open((LPCTSTR)strIns,vDispatch,adOpenKeyset,
adLockOptimistic,ADC mdunknown);
-
7.獲取listctrl中所有選定行的序列號。
方法1:
CString字符串;
for(int I = 0;我& ltm_list。GetItemCount();我)
{
if(m _ list。GetItemState(I,LVIS _選定)= = LVIS _選定)
{
海峽。format(_ T(“行%d被選中“),I);
AfxMessageBox(str);
}
}
方法二:
位置pos = m_list。GetFirstSelectedItemPosition();
if(pos = = NULL)
TRACE0(“未選擇任何項目!\ n ");
其他
{
當(位置)
{
int nItem = m_list。GetNextSelectedItem(pos);
TRACE1(“已選擇項目%d!\n“,nItem);
//妳可以在nItem上自行處理
}
}
-
8.獲取項目信息
TCHAR SZ buf【1024】;
LVITEM lvi
lvi.iItem = nItemIndex
lvi。isubitem = 0;
lvi.mask = LVIF _ TEXT
lvi.pszText = szBuf
lvi . cchtextmax = 1024;
m_list。GetItem(& amp;lvi);
-
9.獲取listctrl所有列的標題字符串內容。
LVCOLUMN lvcol
char string【256】;
int nColNum
CString str column name【4】;//如果有4列
nColNum = 0;
lvcol . mask = LVCF _ TEXT;
lvcol.pszText = str
lvcol.cchTextMax = 256
while(m _ list。GetColumn(nColNum & amp;lvcol)
{
strColumnName【ncol num】= lvcol . psztext;
nColNum
}
-
10.使listctrl中的壹項可見,即滾動滾動條
m_list。ensure visible(I,FALSE);
-
11.獲取listctrl列號。
int nHeadNum = m_list。GetHeaderCtrl()-& gt;GetItemCount();
-
12.刪除所有列
方法1:
while(m _ list。刪除列(0))
因為刪除第壹列後,後續的列將依次上移。
方法二:
int nColumns = 4;
for(int I = nColumns-1;我& gt=0;我-)
m_list。刪除列(I);
-
13.獲取單擊的listctrl的列號。
添加listctrl控件的NM_CLICK消息對應函數。
void ctest 6 DLG::onclick list 1(nmh dr * pNMHDR,LRESULT* pResult)
{
//方法1:
/*
DWORD dw pos = GetMessagePos();
CPoint(低字(dwPos),高字(dwPos));
m_list。screento client(& amp;點);
LVHITTESTINFO lvinfo
lvinfo.pt = point
lvinfo.flags = LVHT _ ABOVE
int nItem = m_list。子項測試(& amplvinfo);
if(nItem!= -1)
{
CString strtemp
Strtemp。Format(“您點擊了第%d行第%d列“,lvinfo.iItem,lvinfo . isubitem);
AfxMessageBox(strtemp);
}
*/
//方法二:
/*
NM _ LISTVIEW * pNMListView =(NM _ LISTVIEW *)pNMHDR;
if(pNMListView-& gt;項目!= -1)
{
CString strtemp
Strtemp。Format(“您點擊了第%d行第%d列“,
pNMListView-& gt;iItem,pNMListView-& gt;iSubItem);
AfxMessageBox(strtemp);
}
*/
* pResult = 0;
}
-
14.判斷是否點擊listctrl的復選框。
添加listctrl控件的NM_CLICK消息對應函數。
void ctest 6 DLG::onclick list 1(nmh dr * pNMHDR,LRESULT* pResult)
{
DWORD dw pos = GetMessagePos();
CPoint(低字(dwPos),高字(dwPos));
m_list。screento client(& amp;點);
LVHITTESTINFO lvinfo
lvinfo.pt = point
lvinfo.flags = LVHT _ ABOVE
UINT nFlag
int nItem = m_list。擊球(點& ampnFlag);
//判斷是否點擊復選框。
if(nFlag = = LVHT _ ONITEMSTATEICON)
{
AfxMessageBox(“指向listctrl的復選框“);
}
* pResult = 0;
}
-
15.右鍵單擊listctrl的項目彈出菜單。
添加listctrl控件的NM_RCLICK消息的相應函數。
void ctest 6 DLG::onclicklist 1(nmh dr * pNMHDR,LRESULT* pResult)
{
NM _ LISTVIEW * pNMListView =(NM _ LISTVIEW *)pNMHDR;
if(pNMListView-& gt;項目!= -1)
{
DWORD dw pos = GetMessagePos();
CPoint(低字(dwPos),高字(dwPos));
CMenu菜單;
驗證(菜單。LoadMenu(IDR _ m ENU1));
CMenu* popup =菜單。get submenu(0);
斷言(彈出!= NULL);
彈出菜單-& gt;trackpoppupmenu(TPM _ left align | TPM _ right button,point.x,point.y,this);
}
* pResult = 0;
}
-
16.項目項目切換焦點(包括用鍵盤和鼠標切換項目時),有些項目會改變狀態序列。
在listctrl控件中添加LVN_ITEMCHANGED消息的相應函數。
void ctest 6 DLG::onitemchangedlist 1(nmh dr * pNMHDR,LRESULT* pResult)
{
NM _ LISTVIEW * pNMListView =(NM _ LISTVIEW *)pNMHDR;
// TODO:在此添加控件通知處理程序代碼
CString sTemp
if((pNMListView-& gt;uOldState & ampLVIS聚焦)= LVIS聚焦& amp& amp
(pNMListView-& gt;聯合國新聞狀態與報道。LVIS焦點)= 0)
{
sTemp。格式(“%d個丟失的焦點”,pNMListView-& gt;iItem);
}
else if((pNMListView-& gt;uOldState & ampLVIS聚焦)= 0 & amp& amp
(pNMListView-& gt;聯合國新聞狀態與報道。聚焦LVIS)=聚焦LVIS)
{
sTemp。格式(“%d獲得焦點”,pNMListView-& gt;iItem);
}
if((pNMListView-& gt;uOldState & ampLVIS選定的)= LVIS選定的& amp& amp
(pNMListView-& gt;聯合國新聞狀態與報道。LVIS _選定的)= 0)
{
sTemp。格式(“%d個丟失的選定項”,pNMListView-& gt;iItem);
}
else if((pNMListView-& gt;uOldState & ampLVIS選定的)= 0 & amp& amp
(pNMListView-& gt;聯合國新聞狀態與報道。LVIS選定的)= LVIS選定的)
{
sTemp。格式(“選擇了%d個“),pNMListView-& gt;iItem);
}
* pResult = 0;
}
-
17.listctrl的子項添加圖標
註意:在用SetItem設置其他項之前,先用InsertItem()插入壹行的第壹列。
m_list。SetExtendedStyle(LVS _ EX _ subiteimages);
m_userlist。SetItem(..);
-
18.在CListCtrl中顯示文件,並根據文件類型顯示圖標。
網上找到的代碼,自己試著修改的,分享壹下。
步驟1:將列表中的圖像列表設置為系統圖像列表。
BOOL setsystem imagelist(clist ctrl & amp;列表)
{
HIMAGELIST himlSmall
HIMAGELIST himlLarge
SHFILEINFO sfi
char csys dir【MAX _ PATH】;
CString strBuf
memset(csy sdir,0,MAX _ PATH);
getwindowsdirect(cSysDir,MAX _ PATH);
strBuf = cSysDir
// SHGetFileInfo:
//如果uFlags包含SHGFI_SYSICONINDEX,則返回值是
//包含大圖標圖像的圖像列表。
//如果SHGFI_SYSICONINDEX中包含SHGFI_SMALLICON,則返回值
//是包含小圖標圖像的圖像列表的句柄。
//
himlSmall =(hima gelist)SHGetFileInfo((LPCSTR)cSysDir,
0,
& ampsfi,
sizeof(SHFILEINFO),
SHGFI _ sysicon index | SHGFI _ small icon);
himallarge =(hima gelist)SHGetFileInfo((LPCSTR)cSysDir,
0,
& ampsfi,
sizeof(SHFILEINFO),
SHGFI _ sysicon index | SHGFI _ large icon);
if(himlSmall & amp;& amphimlLarge)
{
*發送消息(list.m_hWnd,LVM_SETIMAGELIST,
(WPARAM)LVSIL _ SMALL,(LPARAM)himlSmall);
*發送消息(list.m_hWnd,LVM_SETIMAGELIST,
(WPARAM)LVSIL _ NORMAL,(LPARAM)him llarge);
}
返回TRUE
}
第二步:將指定的文件添加到列表中,同時獲取文件的圖標索引,並將圖標添加到列表中。
int geticondex(LPCTSTR lpszPath,BOOL bIsDir,BOOL b selected);//轉發語句
void AddFiles(clist ctrl & amp;list,LPCTSTR lpszFileName,BOOL bAddToDocument)
{
int nIcon = geticondex(lpsz filename,FALSE,TRUE);
CString strSize
CFileFind文件查找;
//獲取文件大小
if(文件查找。find file(lpsz filename))
{
文件查找。FindNextFile();
strSize。格式(“%d”,文件查找。GetLength());
}
其他
strSize =“0“;
//拆分路徑和文件名
CString str filename = lpsz filename;
CString strPath
int nPos = strFileName。reverse find(‘\ \‘);
如果(nPos!= -1)
{
strPath = strFileName。左(NPO);
strFileName = strFileName。mid(NPO 1);
}
//插入列表
int nItem = list。GetItemCount();
//列表。insert item(nItem,strFileName,nIcon);
//列表。SetItemText(nItem,1,strSize);
//
//您可以根據實際需要在這裏修改代碼。
//
}
-
19.listctrl內容應該用大量數據更新以避免閃爍。
m_list。set redraw(FALSE);
//更新內容
m_list。set redraw(TRUE);
m_list。invalidate();
m_list。update window();
20.清除ListCtrl以重新初始化:
//刪除所有行
m_ctrllist。DeleteAllItems();
//刪除所有列
int iColCount = m_ctrllist。GetHeaderCtrl()-& gt;GetItemCount();
//方法1
//原理:刪除第壹列後,其他列向前移動。
while(m _ ctrl list。delete column(0));
//方法2
for(int I = 0;我& ltiColCount我)
{
m_ctrllist。刪除列(0);
}
//方法3
for(int I = icol count-1;我& gt= 0;我-)
{
m_ctrllist。刪除列(I);
}