在使用MFC的CListCtrl控件过程中用到的知识进行总结一下:
向对话框拖一个大小适中的List控件,并为其绑定一个成员变量为m_ListCtrl;
1.对列表控件设置属性:
DWORD dwStyle = m_ListCtrl.GetExtendedStyle();
dwStyle |= LVS_EX_CHECKBOXES; //设置列表控件带有复选框
dwStyle |= LVS_EX_GRIDLINES; //设置列表控件行选中
dwStyle |= LVS_EX_SUBITEMIMAGES; //设置列表控件可添加图标
m_ListCtrl.SetExtendedStyle(dwStyle);
2.对列表控件添加指定行列的图标:
首先在对话框中添加对象CImageList m_ImageList;
其次设置list 控件的属性:
DWORD dwStyle = m_ListCtrl.GetExtendedStyle();
dwStyle |= LVS_EX_CHECKBOXES;
dwStyle |= LVS_EX_GRIDLINES;
dwStyle |= LVS_EX_SUBITEMIMAGES; //这个要进行设置
m_ListCtrl.SetExtendedStyle(dwStyle);
再次创建CImageList 表的空间:
m_ImgList.Create(16, 16, ILC_COLOR24, 11, 0);//参数1和参数2是图标的像素,参数3:图标ID,参数4:要添加多少图标的个数,参数5:还要创建多少空间。
设置图标显示的背景颜色:
m_ImgList.SetBkColor(RGB(255, 255, 255));
UINT nIconID[] = {IDI_ICON1, IDI_ICON2, IDI_ICON3, IDI_ICON4, IDI_ICON5, IDI_ICON6, IDI_ICON7, IDI_ICON8, IDI_ICON9, IDI_ICON10, IDI_ICON11};
for ( int idx = 0; idx < 11; idx++ ) {
m_ImgList.Add(AfxGetApp()->LoadIcon(nIconID[idx]));
}
m_ListCtrl.SetImageList(&m_ImgList, LVSIL_SMALL);
m_ListCtrl.InsertColumn(0, _T("第0列"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(1, _T("第1列"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(2, _T("第2列"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertItem(0, _T("第0行"), 3);//首行添加
m_ListCtrl.InsertItem(1, _T("第1行"), 4);//首行添加
m_ListCtrl.InsertItem(2, _T("第2行"), 5);//首行添加
可以指定在某一列进行添加图标:
注意:前提要先设置一下list控件的风格为:dwStyle |= LVS_EX_SUBITEMIMAGES;
m_ListCtrl.SetItem(0,2,LVIF_TEXT|LVIF_IMAGE,CString(""),1,0,0,0); //第一个参数是行的索引,第二参数设置第几列 , 倒数第四个参数设置第几个图标
m_ListCtrl.SetItem(1,2,LVIF_TEXT|LVIF_IMAGE,CString(""),2,0,0,0); //第一个参数是行的索引,第二参数设置第几列 , 倒数第四个参数设置第几个图标
m_ListCtrl.SetItem(2,2,LVIF_TEXT|LVIF_IMAGE,CString(""),3,0,0,0); //第一个参数是行的索引,第二参数设置第几列 , 倒数第四个参数设置第几个图标
3.在列表控件上添加复选框的时候发现复选框后面单击的时候总是出现一个类似的可编辑框,怎么处理呢?
插入每一行数据的时候要对其进行设置,也就是
将InsertItem()的第三个参数设一个值,这样就ok了。
m_ListCtrl.InsertItem(0, _T("5"), 10);
m_ListCtrl.SetItemText(0, 1, _T("9"));
m_ListCtrl.SetItemText(0, 2, _T("22"));
4.获取或者设置列表中的复选框选项:
//获取复选框是否选中:
m_ListTrl.GetCheck(i);
//设置复选框选中:
m_ListCtrl.SetCheck(i,TRUE);//选择
m_ListCtrl.SetCheck(i,FALSE); //未选择
5.插入标题头向列表控件中:
m_ListCtrl.InsertColumn(1, _T("别名"), LVCFMT_LEFT, 80);//插入列
m_ListCtrl.InsertColumn(2, _T("当前路径"), LVCFMT_LEFT, 230);//插入列
m_ListCtrl.InsertColumn(3, _T("可访问权限路径"), LVCFMT_LEFT, 400);//插入列
6.添加几条数据向列表控件中:
for(int i = 0; i < 10; i++)
{
m_ListCtrl.InsertItem(i,"");
m_ListCtrl.SetItemText(i,0, "第一列");
m_ListCtrl.SetItemText(i,1, "第二列");
m_ListCtrl.SetItemText(i,2, "第三列");
}
7.删除某一列从列表控件中:
int CurSel=m_ListCtrl.GetNextItem(-1,LVNI_ALL | LVNI_SELECTED); //获取选中的行
if(CurSel>=0){
m_ListCtrl.DeleteItem(CurSel);
}
else
AfxMessageBox("请选择指定的一行");
8.选中和取消选中一行
int nIndex = 0;
//选中
m_ListCtrl.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_ListCtrl.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
9.获取列表被选中的复选框的行:
m_ListCtrl.SetExtendedStyle(LVS_EX_CHECKBOXES);
CString str;
for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
{
if( m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_ListCtrl.GetCheck(i))
{
str.Format(_T("第%d行的checkbox为选中状态"), i);
AfxMessageBox(str);
}
}
10.获得列表的列数及行数:
//得到列表的列数
int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();
//得到列表的行数
m_list.GetItemCount();
11.删除列表某一列数据:
m_ListCtrl.DeleteColumn (i);
12.删除列表某一行数据及所有数据:
m_ListCtrl.DeleteItems(5);
m_ListCtrl.DeleteAllItems();
11.改变列表选中行颜色:
首先是添加以下消息
ON_NOTIFY( NM_CUSTOMDRAW, IDC_LIST1, OnDrawColorForMyList ) //为改变颜色添加的消息
再添加类成员函数,就OK了:
//改变 m_ListCtrl控件单行的颜色
void CSSDTDlg::OnDrawColorForMyList( NMHDR *pNmHdr, LRESULT *pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNmHdr );
*pResult = CDRF_DODEFAULT;
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
COLORREF clrNewTextColor, clrNewBkColor;
int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
//选中行显示字体为红色,否则为黑色
if(m_item == nItem) //设置为红色
{
clrNewTextColor = RGB( 255, 0, 0 );
}
else //设置为黑色
{
clrNewTextColor = RGB( 0, 0, 0 );
}
//设置背景色
if( nItem%2 ==0 )
{
clrNewBkColor = RGB( 240, 240, 240 ); //偶数行背景色为灰色
}
else
{
clrNewBkColor = RGB( 255, 255, 255 ); //奇数行背景色为白色
}
pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;
*pResult = CDRF_DODEFAULT;
}
13.对列表 进行排序:
未完待续......