您的位置:首页 > 其它

ClistCtrl 用法

2013-06-04 10:39 176 查看
1、创建create
① 绝对大小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;

GetClientRect(rect);

rclist.bottom = rect.bottom / 2;

rclist.left = rect.left;

rclist.right =rect.right; rclist.top = rect.top;

CListCtrl * list1 = new CListCtrl;

list1->Create(WS_VISIBLE | LVS_REPORT | LVS_ALIGNTOP | WS_BORDER | WS_CHILD, rclist,this,1101/*ID*/);

2、属性设置

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();

TEXTMETRIC tm;

pDC->GetTextMetrics(&tm);

list1->InsertColumn(0,"第一列",LVCFMT_CENTER,100/*列宽*/,0);

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;

column.pszText="第一列";

column.mask=LVCF_TEXT;

list1->InsertColumn(0,&column); //插入一列,列索引为0

list1->SetColumnWidth(0,100); //列宽设置

column.pszText="第二列";

column.mask=LVCF_TEXT;

list1->InsertColumn(1,&column);

list1->SetColumnWidth(1,100); //列宽

column.pszText="第三列";

column.mask=LVCF_TEXT;

list1->InsertColumn(2,&column);

list1->SetColumnWidth(2,100); //列宽

column.pszText="第四列";

column.mask=LVCF_TEXT;

list1->InsertColumn(3,&column);

list1->SetColumnWidth(3,100); //列宽

4、插入一项内容,第一行

① 插入一行 static int i = 0;

CListCtrl * pList = (CListCtrl *)GetDlgItem(1101/*ID*/);

pList->InsertItem(i/*指定行索引*/, "第一列"); //插入一行,插到第一列

pList->SetItemText(i/*指定行索引*/,1/*指定列*/,"第二列"); //插到第一行、第二列

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使用详解 作者:fairness

先在头文件中加入声明:

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);

之类的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: