CListCtrl控件使用指南(大全)

2024-04-20 11:38

本文主要是介绍CListCtrl控件使用指南(大全),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

-------------------------------------------------------------------------------------------------------------------------------------------

本文主要介绍的是MFC中一个重要的控件CListCtrl,其使用范围广,很多软件中都能看到CListCtrl的身影。当然,一些基本的概念和操作MSDN有相关说明,这里汇总并整理了网上一些比较实用的实际操作,每一个都有对应简单案例。

CListCtrl有四种样式:Icon;Smal lcon;List;Report。前三种一般使用很少,最后一种Report是CListCtrl的重点,也是其精髓。

-------------------------------------------------------------------------------------------------------------------------------------------


一、CListCtrl外观风格

只能选下面四种的一种:

      LVS_ICON: 为每个item显示大图标;
      LVS_SMALLICON: 为每个item显示小图标;
      LVS_LIST: 显示一列带有小图标的item;
      LVS_REPORT: 显示item详细资料。
      直观的理解:windows资源管理器,【查看】标签下的“大图标,小图标,列表,详细信息”


先来说一下前三种使用方法:

前三种Icon,Small Icon,List都是通过图标的形式存在,那么他的重点也就是怎么加载图标。

首先需要创建CImageList对象,例如m_ImageList1

//创建大图标,Craete创建一个图标列表,当然大小可以随意设置,这里采用的是加载ICON
if ( m_ImageList1.GetSafeHandle() == NULL )
{m_ImageList1.Create(80,80,ILC_MASK|ILC_COLOR32, 0, 0);m_ImageList1.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));m_ListCtrl1.SetImageList(&m_ImageList1, LVSIL_NORMAL);
}
//加载BMP图片
if (m_StatusImage.GetSafeHandle()==NULL)
{CBitmap Image;BITMAP ImageInfo;Image.LoadBitmap(IDB_SERVER_LIST_IMAGE);Image.GetBitmap(&ImageInfo);m_StatusImage.Create(18,ImageInfo.bmHeight,ILC_COLOR16|ILC_MASK,0,0);m_StatusImage.Add(&Image,RGB(255,0,255));
}
m_ListCtrl2.SetImageList(&m_StatusImage,LVSIL_SMALL);
m_ListCtrl3.SetImageList(&m_StatusImage,LVSIL_SMALL);
//插入节点
for (int i=0;i<40;i++)
{m_ListCtrl1.InsertItem(i, TEXT("Item"));m_ListCtrl2.InsertItem(i, TEXT("Item"));m_ListCtrl3.InsertItem(i, TEXT("Item"));
}



二、下面大篇幅主要介绍Report风格


1、创建列

也就是为标头控件添加节点,用InsertColumn()函数。

①参数1:新列的索引。 ②参数2:列标题的显示文本。③列的对齐方式;它的值可以是下面三个之一:LVCFMT_LEFT、 LVCFMT_RIGHT或 LVCFMT_CENTER。④参数4:列的宽度,以像素为单位。

//插入三个列
m_ListCtrl4.InsertColumn( 0, TEXT("姓名"), LVCFMT_LEFT, 70 );
m_ListCtrl4.InsertColumn( 1, TEXT("年龄"), LVCFMT_LEFT, 70 );
m_ListCtrl4.InsertColumn( 2, TEXT("学号"), LVCFMT_LEFT, 70 );




2、设置列表风格

          之前我们修改窗口属性的时候都是使用的SetWindowLong函数或者ModifyStyle,这次CListCtrl为我们提供一个新函数,SetExtendedStyle,当然通过它只能修改列表的扩展属性。
支持的扩展属性很多,但是常用的就几个而已,其他的可以参照msdn,这里讲解两个常用的样式
LVS_EX_CHECKBOXES:将CListCtrl添加复选框check控件

LVS_EX_FULLROWSELECT:未添加该样式,选择一个节点,默认只能选中节点的第一个元素,而这个属性则可以让选择节点的时候选中整行。
当然这些属性可以通过或运算而多个同时存在。

    LONG lStyle;lStyle = GetWindowLong(m_ListCtrl4.m_hWnd, GWL_STYLE);//获取当前窗口stylelStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_REPORT; //设置styleSetWindowLong(m_ListCtrl4.m_hWnd, GWL_STYLE, lStyle);//设置styleDWORD dwStyle = m_ListCtrl4.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件m_ListCtrl4.SetExtendedStyle(dwStyle); //设置扩展风格

样式风格大全:

LVS_ALIGNLEFT : 用来确定表项的大小图标以左对齐方式显示; 
LVS_ALIGNTOP : 用来确定表项的大小图标以顶对齐方式显示; 
LVS_AUTOARRANGE : 用来确定表项的大小图标以自动排列方式显示; 
LVS_EDITLABELS : 设置表项文本可以编辑,父窗口必须设有LVN_ENDLABELEDIT风格; 
LVS_ICON : 用来确定大图标的显示方式; 
LVS_LIST : 用来确定列表方式显示; 
LVS_NOCOLUMNHEADER : 用来确定在详细资料方式时不显示列表头; 
LVS_NOLABELWRAP : 用来确定以单行方式显示图标的文本项; 
LVS_NOSCROLL : 用来屏蔽滚动条; 
LVS_NOSORTHEADER : 用来确定列表头不能用作按钮功能; 
LVS_OWNERDRAWFIXED : 在详细列表方式时允许自绘窗口; 
LVS_REPORT : 用来确定以详细资料即报告方式显示; 
LVS_SHAREIMAGELISTS : 用来确定共享图像列表方式; 
LVS_SHOWSELALWAYS : 用来确定一直显示被选中表项方式; 
LVS_SINGLESEL : 用来确定在某一时刻只能有一项被选中; 
LVS_SMALLICON : 用来确定小图标显示方式; 
LVS_SORTASCENDING : 用来确定表项排序时是基于表项文本的升序方式; 
LVS_SORTDESCENDING : 用来确定表项排序时是基于表项文本的降序方式;


扩展风格大全:

LVS_EX_GRIDLINES : 绘制表格线
LVS_EX_SUBITEMIMAGES : 子项目图标列表
LVS_EX_CHECKBOXES : 带复选框
LVS_EX_TRACKSELECT : 自动换行
LVS_EX_HEADERDRAGDROP : 报表头可以拖拽
LVS_EX_FULLROWSELECT : 选择整行
LVS_EX_ONECLICKACTIVATE : 单击激活
LVS_EX_TWOCLICKACTIVATE : 双击激活
LVS_EX_FLATSB : 扁平滚动条
LVS_EX_REGIONAL
LVS_EX_INFOTIP
LVS_EX_UNDERLINEHOT
LVS_EX_UNDERLINECOLD
LVS_EX_MULTIWORKAREAS : 多工作区




3、添加列表图标

首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用:

CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL); 

如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用: 

CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);

Report的图标的添加方式和Icon一样,这里我们以添加bmp图片为例:

//加载BMP图标
if (m_StatusImage.GetSafeHandle()==NULL)
{CBitmap Image;BITMAP ImageInfo;Image.LoadBitmap(IDB_SERVER_LIST_IMAGE);Image.GetBitmap(&ImageInfo);m_StatusImage.Create(18,ImageInfo.bmHeight,ILC_COLOR16|ILC_MASK,0,0);m_StatusImage.Add(&Image,RGB(255,0,255));
}
m_ListCtrl4.SetImageList(&m_StatusImage,LVSIL_SMALL);



4、插入节点并设置节点的文本内容

int nCount = m_ListCtrl4.GetItemCount();
//插入行
int nRow=m_ListCtrl4.InsertItem(LVIF_IMAGE|LVIF_TEXT|LVIF_PARAM,0,_T("Item_1"),0,0,2,0);
m_ListCtrl4.SetItemText(nRow, 1, TEXT("Item_2"));//设置文本内容
m_ListCtrl4.SetItemText(nRow, 2, TEXT("Item_3"));



5、设置文本或背景颜色

①、设置显示文本的颜色:

BOOL SetTextColor( RGB(0,255,0) );//例如设置文本为绿色

②、获取显示文本的颜色:

COLORREF GetTextColor( );

③、设置背景颜:

BOOL SetTextBkColor( RGB(255,0,0));//例如设置背景为红色

④、获取背景颜色:

COLORREF GetTextBkColor( );
⑤、设置背景位图:
BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent);



6、总是显示选定内容

总是显示选定内容,即便控件没有焦点。

方法一:将控件的Always Show selection 属性设为TRUE;

方法二:在设置列表风格时,添加宏LVS_SHOWSELALWAYS 。



7、选中和取消选中一行

用SetItemState()函数。①参数1:被设置项的索引;②参数2:状态位的新值;③参数3:指定的状态位掩码更改。

int nIndex = 0;
//选中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);



8、判断节点是否被Check选中

用GetCheck()函数

void CListCtrlDlg::OnBnClickCheckState()
{CString str,str1=TEXT("被Check的行数分别为:");for(int i=0; i<m_ListCtrl4.GetItemCount(); i++){if( m_ListCtrl4.GetCheck(i)){str.Format(TEXT("第%d行的checkbox为选中状态"),i);str1+=str;}}AfxMessageBox(str1);
}



9、判断节点是否被高亮选中

通过该项的选中状态(LVIS_SELECTED)来判断

m_ListCtrl4.SetExtendedStyle(LVS_EX_CHECKBOXES);
CString str;
for(int i=0; i<m_ListCtrl4.GetItemCount(); i++)
{if( m_ListCtrl4.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ){str.Format(_T("第%d行为高亮选中状态"), i);AfxMessageBox(str);}
}
注意:这里跟上面的check选中有所不同,通过下图来说明:①处为Check选中;②处为高亮选中。






10、获取选中行的索引

默认情况下CListCtrl是支持多选的,即支持键盘上的“Ctrl”和“Shift”按键的操作,若要需要单选(即每次只能选取列表的一项),可将控件的Single Selection属性设为TRUE,或者添加LVS_SINGLESEL属性样式。

这里介绍两种方法来获取选中行的索引:

方法一:通过遍历所有行,然后挨行判断当前的选取状态。

CString str,str1=TEXT("选中的行数分别为:");
for(int i=0; i<m_ListCtrl4.GetItemCount(); i++)
{if( m_ListCtrl4.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ){str.Format(TEXT("第%d行为高亮选中状态!"),i);str1+=str;}
}
AfxMessageBox(str1);
m_ListCtrl4.SetFocus();

方法二:通过迭代的方式进行遍历

POSITION pos = m_ListCtrl4.GetFirstSelectedItemPosition();
if (pos == NULL)
{str1 = TEXT("没有高亮选中任何节点");
}
else
{while (pos){int nItem = m_ListCtrl4.GetNextSelectedItem(pos);str.Format(TEXTT("列表中第%d行被高亮选中!"),nItem);str1+=str;}
}AfxMessageBox(str1);
m_ListCtrl4.SetFocus();


11、获取列数

这里使用到了CHeaderCtrl控件

int nColumnCount = m_ListCtrl4.GetHeaderCtrl()->GetItemCount();


12、获取节点信息

通过GetItem()函数,我们以获取最后一行的信息为例:

void CListCtrlDlg::OnBnClickInfo()
{TCHAR szBuffer[MAX_PATH]=TEXT("");//存放文本结果的缓存CString str=TEXT("节点信息分别为:");//获取列数int nColumnCount = m_ListCtrl4.GetHeaderCtrl()->GetItemCount();LVITEM lvi;//结构体,表示一行lvi.iItem = m_ListCtrl4.GetItemCount()-1;lvi.mask = LVIF_TEXT;lvi.cchTextMax = CountArray(szBuffer);for (int i=0;i<nColumnCount; i++){lvi.iSubItem = i;lvi.pszText = szBuffer;m_ListCtrl4.GetItem(&lvi);str+=TEXT("[");str+=szBuffer;str+=TEXT("] ");}AfxMessageBox(str);
}

注意:mask指明你要获取那些信息,例如LVIF_TEXT:文本信息;LVIF_IMAGE:图像信息;LVIF_STATE:状态信息。




13、滚动到要显示的行上

很多时候,我们的数据量比较大,而我们通过查找获取到了行数后,我们想快速定位到该行,这里我们可以用EnsureVisible()函数。这样可以使列表的某一指定行可见。

这里以定位到最后一行并选中该行为例:

void CListCtrlDlg::OnBnClickVis()
{int nItem = m_ListCtrl4.GetItemCount()-1;m_ListCtrl4.EnsureVisible(nItem, FALSE);//滚动滚动条,使列表的第i行可见m_ListCtrl4.SetItemState(nItem,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED);m_ListCtrl4.SetSelectionMark(nItem);m_ListCtrl4.SetFocus();
}



14、选中行

注意:这句代码只是让指定行高亮显示,如果使用后再用GetSelectionMark函数来得到选中行,结果往往是错误的。比如,先用鼠标点击选中第5行,调用GetSelectionMark函数得到的是4(即第5行,下标从0开始),再调用SetItemState函数选中第2行,然后调用GetSelectionMark函数得到的还是4,所以,需要在设置选中行高亮显示时,一般与SetSelectionMark函数连用。

m_ListCtrl4.SetItemState(nItem,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED);
m_ListCtrl4.SetSelectionMark(nItem);
m_ListCtrl4.SetFocus();


15、取消选中

void CListCtrlDlg::OnBnClickUnSel()
{for(int i=0; i<m_ListCtrl4.GetItemCount(); i++){if( m_ListCtrl4.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ){//通过改变选中状态来实现m_ListCtrl4.SetItemState(i,0,LVIS_SELECTED);}}m_ListCtrl4.SetSelectionMark(-1);m_ListCtrl4.SetFocus();
}



16、获取标头控件的节点文本

即列的Header字符串的内容

void CListCtrlDlg::OnBnClickHead()
{LVCOLUMN lvcol;TCHAR  szBuffer[MAX_PATH]=TEXT("");int nColumnIndex;;CString str=TEXT("标题头文本分别为:");nColumnIndex = 0;lvcol.mask = LVCF_TEXT;lvcol.pszText = szBuffer;lvcol.cchTextMax = CountArray(szBuffer);while(m_ListCtrl4.GetColumn(nColumnIndex, &lvcol)){str+=TEXT("[");str+= lvcol.pszText;str+=TEXT("]");nColumnIndex++;}AfxMessageBox(str);
}




17、删除指定行

以删除最后一行为例:

m_ListCtrl4.DeleteItem(m_ListCtrl4.GetItemCount()-1);//参数为指定行的索引



18、删除所有行

m_ListCtrl4.DeleteAllItems();



19、删除所有标头(列)

包括标头控件。

方法一:当删除下标为0的节点后,后面的节点都会依次向前移动,重新排列,所以我们只要依次把所有第一个节点删除即可。

while( m_ListCtrl4.DeleteColumn(0) );


方法二:和方法一原理类似,这次是从后往前删除

int nColumnCount = m_ListCtrl4.GetHeaderCtrl()->GetItemCount();
for (int i=nColumnCount-1; i>=0; i--)m_ListCtrl4.DeleteColumn (i);



20、左键消息,得到单击处的行列号

         列表控件的消息映射同样使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。

添加ON_NOTIFY的NM_CLICK消息,这里以单击事件的区域位置为例,即鼠标在哪行那列点击了。

方法一:

void CListCtrlDlg::OnLclickList4(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);//方法一:DWORD dwPos = GetMessagePos();CPoint point( LOWORD(dwPos), HIWORD(dwPos) );m_ListCtrl4.ScreenToClient(&point);LVHITTESTINFO lvinfo;lvinfo.pt = point;lvinfo.flags = LVHT_ABOVE;int nItem = m_ListCtrl4.SubItemHitTest(&lvinfo);if(nItem != -1){CString str;str.Format(TEXT("单击的是第%d行第%d列"), lvinfo.iItem, lvinfo.iSubItem);AfxMessageBox(str);}*pResult = 0;
}


方法二:

void CListCtrlDlg::OnLclickList4(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);// 方法二:NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;if(pNMListView->iItem != -1){CString str;str.Format(TEXT("单击的是第%d行第%d列"),pNMListView->iItem, pNMListView->iSubItem);AfxMessageBox(str);}*pResult = 0;
}




21、右键消息

添加ON_NOTIFY的NM_RCLICK消息,这里以右键弹出菜单为例:

void CListCtrlDlg::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;if (menu.CreatePopupMenu()==FALSE) return;menu.AppendMenu(0,2000,TEXT("菜单节点"));menu.AppendMenu(0,2001,TEXT("菜单节点"));menu.AppendMenu(0,2002,TEXT("菜单节点"));menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this);}*pResult = 0;
}




22、判断是否点击在控件的CheckBox上

添加CListCtrl控件的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;
}




23、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 hereCString 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;
}



24、列表内容进行大数据量更新时,避免闪烁

	m_list.SetRedraw(FALSE);//更新内容m_list.SetRedraw(TRUE);m_list.Invalidate();m_list.UpdateWindow();




25、CListCtrl的排序

步骤一:排序用的比较函数

static int CALLBACK MyCompareProc(LPARAMlParam1, LPARAMlParam2, LPARAMlParamSort)
{CString &lp1 = *((CString *)lParam1);CString &lp2 = *((CString *)lParam2);int &sort = *(int *)lParamSort;if (sort == 0){returnlp1.CompareNoCase(lp2);}else{returnlp2.CompareNoCase(lp1);}
}
步骤二:要处理的事件
ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, &CDlg::OnLvnColumnclickList1)
步骤三:排序处理代码
voidCDlg::OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMLISTVIEWpNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);intLength = m_ListCtrl.GetItemCount();CArray<CString,CString> ItemData;ItemData.SetSize(Length);for (inti = 0; i < Length; i++){ItemData[i] = m_ListCtrl.GetItemText(i,pNMLV->iSubItem);m_ListCtrl.SetItemData(i,(DWORD_PTR)&ItemData[i]);//设置排序关键字}staticintsort = 0;staticintSubItem = 0;if (SubItem != pNMLV->iSubItem){sort = 0;SubItem = pNMLV->iSubItem;}else{if (sort == 0){sort = 1;}else{sort = 0;}}m_ListCtrl.SortItems(MyCompareProc,(DWORD_PTR)&sort);//排序*pResult = 0;
}
相关连接: https://support.microsoft.com/en-us/help/250614/how-to-sort-items-in-a-clistctrl-in-report-view



26、在CListCtrl显示文件,并根据文件类型来显示图标

网上找的一段代码,供大家参考:

BOOL CTest6Dlg::OnInitDialog()
{CDialog::OnInitDialog();HIMAGELIST himlSmall;HIMAGELIST himlLarge;SHFILEINFO sfi;char  cSysDir[MAX_PATH];CString  strBuf;memset(cSysDir, 0, MAX_PATH);GetWindowsDirectory(cSysDir, MAX_PATH);strBuf = cSysDir;sprintf(cSysDir, "%s", strBuf.Left(strBuf.Find("\\")+1));himlSmall = (HIMAGELIST)SHGetFileInfo ((LPCSTR)cSysDir, 0, &sfi,sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON );himlLarge = (HIMAGELIST)SHGetFileInfo((LPCSTR)cSysDir, 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON);if (himlSmall && himlLarge){::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,(WPARAM)LVSIL_SMALL, (LPARAM)himlSmall);::SendMessage(m_list.m_hWnd, LVM_SETIMAGELIST,(WPARAM)LVSIL_NORMAL, (LPARAM)himlLarge);}return TRUE;  // return TRUE  unless you set the focus to a control
}void CTest6Dlg::AddFiles(LPCTSTR lpszFileName, BOOL bAddToDocument)
{int nIcon = GetIconIndex(lpszFileName, FALSE, FALSE);CString strSize;CFileFind filefind;//  get file sizeif (filefind.FindFile(lpszFileName)){filefind.FindNextFile();strSize.Format("%d", filefind.GetLength());}elsestrSize = "0";// split path and filenameCString strFileName = lpszFileName;CString strPath;int nPos = strFileName.ReverseFind('\\');if (nPos != -1){strPath = strFileName.Left(nPos);strFileName = strFileName.Mid(nPos + 1);}// insert to listint nItem = m_list.GetItemCount();m_list.InsertItem(nItem, strFileName, nIcon);m_list.SetItemText(nItem, 1, strSize);m_list.SetItemText(nItem, 2, strFileName.Right(3));m_list.SetItemText(nItem, 3, strPath);
}int CTest6Dlg::GetIconIndex(LPCTSTR lpszPath, BOOL bIsDir, BOOL bSelected)
{SHFILEINFO sfi;memset(&sfi, 0, sizeof(sfi));if (bIsDir){SHGetFileInfo(lpszPath, FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(sfi), SHGFI_SMALLICON | SHGFI_SYSICONINDEX |SHGFI_USEFILEATTRIBUTES |(bSelected ? SHGFI_OPENICON : 0)); return  sfi.iIcon;}else{SHGetFileInfo (lpszPath, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES | (bSelected ? SHGFI_OPENICON : 0));return   sfi.iIcon;}return  -1;
}


本文是对网上相关文章的汇总和整理,相关原始链接如下:

http://jingyan.baidu.com/article/1709ad80a079f94634c4f0a2.html

http://www.cppblog.com/xmli/archive/2014/01/03/148482.html





这篇关于CListCtrl控件使用指南(大全)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920165

相关文章

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

秒变高手:玩转CentOS 7软件更换的方法大全

在 CentOS 7 中更换软件源可以通过以下步骤完成。更换源可以加快软件包的下载速度,特别是当默认源速度较慢时。以下是详细步骤: 前言 为了帮助您解决在使用CentOS 7安装不了软件速度慢的问题,我们推出了这份由浪浪云赞助的教程——“CentOS7如何更换软件源加快下载速度”。 浪浪云,以他们卓越的弹性计算、云存储和网络服务受到广泛好评,他们的支持和帮助使得我们可以将最前沿的技术知识分

小程序button控件上下边框的显示和隐藏

问题 想使用button自带的loading图标功能,但又不需要button显示边框线 button控件有一条淡灰色的边框,在控件上了样式 border:none; 无法让button边框隐藏 代码如下: <button class="btn">.btn{border:none; /*一般使用这个就是可以去掉边框了*/} 解决方案 发现button控件有一个伪元素(::after

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

设计模式大全和详解,含Python代码例子

若有不理解,可以问一下这几个免费的AI网站 https://ai-to.cn/chathttp://m6z.cn/6arKdNhttp://m6z.cn/6b1quhhttp://m6z.cn/6wVAQGhttp://m6z.cn/63vlPw 下面是设计模式的简要介绍和 Python 代码示例,涵盖主要的创建型、结构型和行为型模式。 一、创建型模式 1. 单例模式 (Singleton

Maven使用指南的笔记

文档索引 Maven in 5 Minutes 篇幅很短,快速上手,不求甚解。 执行如下命令,创建项目的基础配置。 mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1