ClistCtrl 的用法

来源:互联网 发布:淘宝情趣内衣网红裸模 编辑:程序博客网 时间:2024/05/16 15:13
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);/*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。

3.指定位置

  CRect rect;

  rect.top = 100;

  rect.left = 100;

  rect.right = rect.left  + 100;

  rect.bottom = rect.top + 100;

  list1 -> MoveWindow(rect);

 

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

② 方法二 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); //列宽

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);
之类的代码。

原创粉丝点击