CListCtrl使用详解



1。先来介绍REPORT类型的CListCtrl:
首先使用下面的语句设置CListCtrl的style:
  DWORD   SetExtendedStyle(   DWORD   dwNewStyle   );
其中
  LVS_EX_CHECKBOXES   表示添加CheckBox
  LVS_EX_FULLROWSELECT   表示选择整行
  LVS_EX_GRIDLINES   表示添加表格线

如果设置了LVS_EX_CHECKBOXES属性,则可以用
  BOOL   GetCheck(   int   nItem   )   const;
来得到某一行是否Checked。

可以先用下面的语句来删除以前的东西:
  for(int   k=2;k> =0;k--)   //注意要从后往前删,否则出错
    m_ListCtrl.DeleteColumn(k);
  m_ListCtrl.DeleteAllItems();

用下面的语句新建列:
  m_ListCtrl.InsertColumn(0,_T( "文件名 "),LVCFMT_IMAGE|LVCFMT_LEFT);
  m_ListCtrl.InsertColumn(1,_T( "仪器类别 "));
  m_ListCtrl.InsertColumn(2,_T( "项目类别 "));
 
其中LVCFMT_IMAGE表示可以在第一列加入图标。如果不要图标可以删去。

然后设置列宽:
  for(j=0;j <3;j++)
    m_ListCtrl.SetColumnWidth(j   ,100);
 
以下为列表加入图标,如果不需要图标,可以跳过这一步。注意只在第一次加入,如果多次加入会出错!
先在头文件中加入声明:
  CImageList   m_ImageList;
这是必要的,如果在cpp的某个函数中加入由于生命期结束,CImageList自动释放,则效果是列表中看不到图标,只看到一个白方块。
下面生成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;

2。如果是ICON类型的CListCtrl,则要做一点点改动:
把绑定图标集的代码由
  SetImageList(&m_ImageList,LVSIL_SMALL);
改为
  SetImageList(&m_ImageList,LVSIL_NORMAL);

插入行时只用
  InsertItem(i,mainSet.m_FileName,i);
不用
  SetItemText(i,1,type);
之类的代码。

你可能感兴趣的:(list)