CListCtrl使用详解

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

  LVS_EX_GRIDLINES   表示添加表格线 

CListCtrl固定标题列宽:

CHeaderCtrl* pHeaderCtrl = (CHeaderCtrl*)m_ListCtrl.GetHeaderCtrl();   
pHeaderCtrl->EnableWindow( FALSE ) ;



如果设置了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); 

之类的代码。 


3.其他技巧

CListCtrl支持列拖动及排序:

 m_ListCtrl.SetExtendedStyle(LVS_EX_HEADERDRAGDROP);
即可实现拖动,排序有开源的CSortListCtrl可以使用。

其它常用:

  dwStyle |= LVS_EX_FULLROWSELECT;      //整行选中,REPORT风格下
 dwStyle |= LVS_EX_CHECKBOXES ;       //前边带复选框
 dwStyle |= LVS_EX_GRIDLINES;           //带网格线

dwStyle |= LVS_EX_HEADERDRAGDROP;  //标题栏可以交换顺序  
 m_ListCtrl.SetExtendedStyle(dwStyle);

 

 //重写此函数 禁用标题栏拖动列宽

BOOL CSortListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: Add your specialized code here and/or call the base class
HD_NOTIFY *pHDN = (HD_NOTIFY*)lParam; 
switch   (((NMHDR*)lParam)->code) 
case   HDN_BEGINTRACKW: 
case   HDN_BEGINTRACKA: 
//if (pHDN->iItem == 0)   // 指定哪一列
{
*pResult = TRUE;      //disable   tracking 
return TRUE;          //Processed   message 
}
return CListCtrl::OnNotify(wParam, lParam, pResult);
}


另一篇:

(一)列表控制的主要功能

列表控制和视(List Control&View)主要用来以各种方式显示一组数据记录供用户进行各种操作,Windows98/95中资源管理器中的“查看”标签下的“大图标|小图标|列表|详细资源”就是一个非常好的典型应用。列表中的记录可以包括多个数据项,也可以包括表示数据内容的大小图标,用来表示数据记录的各种属性。

列表控制提供了对Windows列表功能操作的基本方法,而使用列表视的视函数可以对列表视进行各种操作,通过调用视成员GetListCtrl获取嵌在列表视内列表控制的引用(GetListCtrl& ctrlList = GetListCtrl()),就可以和列表控制一样进行各种操作。

操作一个列表控制和视的基本方法为:

创建列表控制;

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值