① 绝对大小CRect(10,10,600,200) CListCtrl * list1 = new CListCtrl; list1->Create(WS_VISIBLE | LVS_REPORT | LVS_ALIGNTOP | WS_BORDER | WS_CHILD, CRect(10,10,600,200),this,1101/*ID*/);
② 相对大小rclist CRect rect,rclist;
rclist.bottom = rect.bottom / 2;
CListCtrl * list1 = new CListCtrl;
list1->SetTextColor(RGB(255,0,255)); //设定文字颜色,紫色
list1->SetExtendedStyle(LVS_EX_FULLROWSELECT/*整行选中*/ | LVS_EX_GRIDLINES/*带表格线*/ | LVS_EX_CHECKBOXES /*表示添加CheckBox*/);
※如果设置了LVS_EX_CHECKBOXES属性,则可以用 list1->GetCheck(0/*行索引nItem */) 来得到第一行是否Checked。
//具体参看MSDN: ClistCtrl 的Attributes
3、插入列
① 方法一 CDC * pDC = GetDC();
pDC->GetTextMetrics(&tm);
list1->InsertColumn(1,"第二列",LVCFMT_CENTER,100,1);
list1->InsertColumn(2,"第三列",LVCFMT_CENTER,100,2);
list1->InsertColumn(3,"第四列",LVCFMT_CENTER,20*tm.tmAveCharWidth,3);
list1->InsertColumn(4,"第五列",LVCFMT_CENTER,20*tm.tmAveCharWidth,4);
② 方法二 LV_COLUMN column;
list1->SetColumnWidth(0,100); //列宽设置
column.pszText="第二列";
column.pszText="第三列";
column.mask=LVCF_TEXT;
list1->InsertColumn(2,&column);
column.pszText="第四列";
4、插入一项内容,第一行
① 插入一行 static int i = 0;
pList->SetItemText(i,2,"第三列"); //插到第一行、第三列
pList->SetItemText(i,3,"第四列"); //插到第一行、第四列
pList->SetItemText(i,4,"第五列"); //插到第一行、第五列 i++;
② 末尾插入一行 CListCtrl * pList = (CListCtrl *)GetDlgItem(1101/*ID*/);
pList ->InsertItem(pList ->GetItemCount()/*指定行索引*/,str); // pList ->GetItemCount() 得到总共行数,在末尾添加一行
pList ->SetItemText(pList ->GetItemCount()-1/*指定行索引*/,1/*指定列*/,"第二列");
pList ->SetItemText(pList ->GetItemCount()-1/*指定行索引*/,2/*指定列*/,"第三列");
pList ->SetItemText(pList ->GetItemCount()-1/*指定行索引*/,3/*指定列*/,"第四列");
pList ->SetItemText(pList ->GetItemCount()-1/*指定行索引*/,4/*指定列*/,"第五列");
※ 行索引是基于0的,第一行的索引为0
5、删除一行
pList->DeleteItem(0/*行索引*/);
6、删除所有,清空
pList->DeleteAllItems();
7、复选框操作
1,添加:
复选框属性为LVS_EX_CHECKBOXES,可在参看第2点添加或:初始化列表框时添加
list1->SetExtendedStyle(list1->GetExtendedStyle() | LVS_EX_CHECKBOXES); // list1为CListCtrl对象
※去掉一项属性为 list1->SetExtendedStyle(list1->GetExtendedStyle() &~ LVS_EX_CHECKBOXES);
2,查看给定的一项是否被选中,给定行索引 int index = 0; //第一行 list1->GetCheck(index) == TRUE; 则被选中,list1->GetCheck(index) == FALSE; 则没被选中
3,选中或取消选中
list1->SetCheck(index,TRUE); //选中
list1->SetCheck(index,FALSE); //取消选中
8、查找
1,查找一项内容
LVFINDINFO finfo;
finfo.flags = LVFI_STRING;
finfo.psz = "要查找的内容";
int nStart = 3; //从第4行开始查找(不包括第4行),nStart= -1时则表示从头查找
int index = pList->FindItem(&finfo,nStart); //pList 为指向CListCtrl控件的指针,返回基于0的行索引;返回 -1时,没查到
2,把查到的内容放在当页面显示
pList->EnsureVisible(index,TRUE);
9、加入图标
1,先在头文件中加入声明: CImageList m_ImageList; //如果在cpp的某个函数中加入,由于生命期结束,CImageList自动释放,则效果是列表中看不到图标,只看到一个白方块。
2, m_ImageList.Create(32, 32, ILC_COLOR32 | ILC_MASK, 1, 4);
int iImg = m_ImageList.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
list1->SetImageList(&m_ImageList,LVSIL_SMALL); // list1为CListCtrl对象
3,摘自 CListCtrl使用详解
先在头文件中加入声明:
CImageList m_ImageList;
下面生成CImageList,并将其绑定到CListCtrl中,这是CImageList中还没有图标,只是一个容器:
static int flag=2;
if(flag==2){//只调用一次SetImageList,否则出错
m_ImageList.Create(128, 128, ILC_COLORDDB|ILC_MASK, 20, 1);
m_ListCtrl.SetImageList(&m_ImageList,LVSIL_SMALL);
}
flag=(flag+1)%2;
如果CListCtrl已经用过,曾经加过图标进去,这时就要删除上次放进m_ImageList中的Image
for(int kk=0;kk<m_ImageList.GetImageCount();kk++)
m_ImageList.Remove(k);
下面介绍如何向CListCtrl里面加入行,并同时为每一行动态加入图标:
假设m_listRowCount为要加入的行数。
CBitmap* bitmap;
bitmap=new CBitmap[m_list1rowCount];
HBITMAP hbitmap;
for(int i = 0; i < m_listRowCount; i++)
{
//为每一行插入相应的缩略图
CFile f;
CFileException e;
if( !f.Open(m_FileName, CFile::modeRead, &e )){ //m_FileName为bmp文件名,由你来定
hbitmap = (HBITMAP)LoadImage(NULL,path+"blank.bmp",IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
}else{
f.Close();
hbitmap = (HBITMAP)LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0,
LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
}
bitmap[i].Attach(hbitmap);
m_ImageList.Add(&bitmap[i], RGB(0, 128, 128));
//插入行
m_ListCtrl.InsertItem(i,m_FileName,i);
m_ListCtrl.SetItemText(i,1,type);
m_ListCtrl.SetItemText(i,2,m_Path);
}
//记得删除已经没用的临时文件
if(m_list1rowCount!=0)
delete[] bitmap;
如果是ICON类型的CListCtrl,则要做一点点改动:
把绑定图标集的代码由
SetImageList(&m_ImageList,LVSIL_SMALL);
改为
SetImageList(&m_ImageList,LVSIL_NORMAL);
插入行时只用
InsertItem(i,mainSet.m_FileName,i);
不用
SetItemText(i,1,type);
之类的代码。