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
    评论
要在C++中使用链表和CListCtrl来实现数据的页显示,你可以将链表中的数据逐个添加到CListCtrl控件中,并根据当前页码和分页大小显示对应的数据。 以下是一个示例代码,展示了如何使用链表和CListCtrl来实现数据的分页显示: ```cpp #include <afxwin.h> #include <afxcmn.h> #include <vector> struct DataItem { int id; CString name; }; class CMyDialog : public CDialog { private: CListCtrl m_listCtrl; std::vector<DataItem> m_data; int m_pageSize; int m_currentPage; public: CMyDialog() : CDialog(IDD_MYDIALOG) { m_pageSize = 5; m_currentPage = 1; } protected: virtual BOOL OnInitDialog() { CDialog::OnInitDialog(); // 创建CListCtrl控件 m_listCtrl.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT, CRect(10, 10, 300, 200), this, IDC_LIST_CTRL); m_listCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT); // 添加列标题 m_listCtrl.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 50); m_listCtrl.InsertColumn(1, _T("Name"), LVCFMT_LEFT, 100); // 添加示例数据到链表 for (int i = 1; i <= 20; i++) { CString name; name.Format(_T("Item %d"), i); m_data.push_back({i, name}); } // 显示第一页数据 ShowPage(m_currentPage); return TRUE; } void ShowPage(int pageNumber) { // 清空列表 m_listCtrl.DeleteAllItems(); // 计算当前页的起始索引和结束索引 int startIndex = (pageNumber - 1) * m_pageSize; int endIndex = startIndex + m_pageSize - 1; if (endIndex >= m_data.size()) { endIndex = m_data.size() - 1; } // 添加当前页的数据到列表 for (int i = startIndex; i <= endIndex; i++) { const DataItem& item = m_data[i]; int index = m_listCtrl.InsertItem(i - startIndex, _T("")); m_listCtrl.SetItemText(index, 0, CString(item.id)); m_listCtrl.SetItemText(index, 1, item.name); } } afx_msg void OnBnClickedPrevButton() { if (m_currentPage > 1) { m_currentPage--; ShowPage(m_currentPage); } } afx_msg void OnBnClickedNextButton() { int totalPages = (m_data.size() + m_pageSize - 1) / m_pageSize; if (m_currentPage < totalPages) { m_currentPage++; ShowPage(m_currentPage); } } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyDialog, CDialog) ON_BN_CLICKED(IDC_PREV_BUTTON, &CMyDialog::OnBnClickedPrevButton) ON_BN_CLICKED(IDC_NEXT_BUTTON, &CMyDialog::OnBnClickedNextButton) END_MESSAGE_MAP() int main() { AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0); CMyDialog dlg; dlg.DoModal(); return 0; } ``` 在这个示例代码中,创建了一个自定义的对话框类`CMyDialog`,其中包含一个CListCtrl控件用于显示数据。 在`OnInitDialog`函数中,首先创建了CListCtrl控件,并设置了扩展样式和列标题。然后,添加了一些示例数据到链表。 `ShowPage`函数用于根据当前页码显示对应的数据。首先,清空列表中的所有项。然后,根据当前页码计算起始索引和结束索引,并将对应的数据逐个添加到列表中。 在`OnBnClickedPrevButton`和`OnBnClickedNextButton`消息处理函数中,分别处理上一页和下一页按钮的点击事件。通过更新当前页码并调用`ShowPage`函数来显示上一页或下一页的数据。 最后,在`main`函数中创建了`CMyDialog`对象,并显示对话框。 运行这段代码,你会看到一个带有上一页和下一页按钮的对话框,点击按钮可以切换数据的分页显示。 这个示例代码基于MFC框架,使用了MFC的消息映射和对话框类。如果你不熟悉MFC,你可以根据自己的需求将相关代码移植到其他框架或平台上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值