1 CListCtrl的风格

CListCtrl的风格有四种:

  • LVS_ICON: 为每个item显示大图标
  • LVS_SMALLICON: 为每个item显示小图标
  • LVS_LIST: 显示一列带有小图标的item
  • LVS_REPORT: 显示item详细资料

分别对应着资源管理器查看菜单下的大图标,小图标,列表,详细资料。

可以在控件属性视图下设置:View属性.

也可以用代码来设置,如下:

[cpp] view plaincopy print?
  1. DWORD SetView(
  2. int iView
  3. );
DWORD SetView(int iView
);

以下解说均以report风格为例.

2 设置CListCtrl风格及扩展风格

获取及设置风格代码示例代码如下:

[cpp] view plaincopy print?
  1. LONG lStyle;
  2. lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
  3. lStyle &= ~LVS_TYPEMASK; //清除显示方式位
  4. lStyle |= LVS_REPORT; //设置style
  5. SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style
LONG lStyle;
lStyle = GetWindowLong(m_list.m_hWnd, GWL_STYLE);//获取当前窗口style
lStyle &= ~LVS_TYPEMASK; //清除显示方式位
lStyle |= LVS_REPORT; //设置style
SetWindowLong(m_list.m_hWnd, GWL_STYLE, lStyle);//设置style

获取及设置扩展风格示例代码如下:

[cpp] view plaincopy print?
  1. DWORD dwStyle = m_list.GetExtendedStyle();
  2. dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
  3. dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
  4. dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
  5. m_list.SetExtendedStyle(dwStyle); //设置扩展风格
DWORD dwStyle = m_list.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_list.SetExtendedStyle(dwStyle); //设置扩展风格

3 插入数据

插入列,示例代码如下:

[cpp] view plaincopy print?
  1. m_list_av.InsertColumn(0,"PID");
  2. m_list_av.InsertColumn(1,"name");
  3. m_list_av.InsertColumn(2,"value");
  4. CRect rect;
  5. m_list_av.GetClientRect(rect);                    //获得当前客户区信息
  6. m_list_av.SetColumnWidth(0,rect.Width()/6);       //设置列的宽度。
  7. m_list_av.SetColumnWidth(1,rect.Width()/2);
  8. m_list_av.SetColumnWidth(2,rect.Width()/3);
m_list_av.InsertColumn(0,"PID");
m_list_av.InsertColumn(1,"name");
m_list_av.InsertColumn(2,"value");CRect rect;
m_list_av.GetClientRect(rect);                    //获得当前客户区信息
m_list_av.SetColumnWidth(0,rect.Width()/6);       //设置列的宽度。
m_list_av.SetColumnWidth(1,rect.Width()/2);
m_list_av.SetColumnWidth(2,rect.Width()/3);

也可用另一种方式,如:

[cpp] view plaincopy print?
  1. m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列,LVCFMT_LEFT为对齐方式,40为列宽
  2. m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );
m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列,LVCFMT_LEFT为对齐方式,40为列宽
m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );

插入行,示例代码如下:

[cpp] view plaincopy print?
  1. CString str;
  2. for(int i=0; i<m_av_count; i++){
  3. m_list_av.InsertItem(i,m_avs[i].name);
  4. str.Format("%04x",m_avs[i].pid);
  5. m_list_av.SetItemText(i,0,str);
  6. m_list_av.SetItemText(i,1,m_avs[i].name);
  7. GetValueAsStirng(&m_avs[i],str);
  8. m_list_av.SetItemText(i,2,str);
  9. }
CString str;
for(int i=0; i<m_av_count; i++){m_list_av.InsertItem(i,m_avs[i].name);str.Format("%04x",m_avs[i].pid);m_list_av.SetItemText(i,0,str);m_list_av.SetItemText(i,1,m_avs[i].name);GetValueAsStirng(&m_avs[i],str);m_list_av.SetItemText(i,2,str);
}

另一个示例如下:

[cpp] view plaincopy print?
  1. CString strText;
  2. int nColumnCount = m_myListCtrl.GetHeaderCtrl()->GetItemCount();
  3. // Insert 10 items in the list view control.
  4. for (int i = 0; i < 10; i++)
  5. {
  6. strText.Format(TEXT("item %d"), i);
  7. // Insert the item, select every other item.
  8. m_myListCtrl.InsertItem(LVIF_TEXT | LVIF_STATE, i, strText,
  9. (i % 2) == 0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0);
  10. // Initialize the text of the subitems.
  11. for (int j = 1; j < nColumnCount; j++)
  12. {
  13. strText.Format(TEXT("sub-item %d %d"), i, j);
  14. m_myListCtrl.SetItemText(i, j, strText);
  15. }
  16. }
CString strText;
int nColumnCount = m_myListCtrl.GetHeaderCtrl()->GetItemCount();// Insert 10 items in the list view control.
for (int i = 0; i < 10; i++)
{strText.Format(TEXT("item %d"), i);// Insert the item, select every other item.m_myListCtrl.InsertItem(LVIF_TEXT | LVIF_STATE, i, strText, (i % 2) == 0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0);// Initialize the text of the subitems.for (int j = 1; j < nColumnCount; j++){strText.Format(TEXT("sub-item %d %d"), i, j);m_myListCtrl.SetItemText(i, j, strText);}
}

4 一直选中一行

在默认情况下,当选一行,再点击其它地方时,原先选中的一行会推动高亮显示,如果你想保留高亮显示,则可以在属性面板上找到属性Always Show Selection,并设置为true.

也可用设置扩展风格的方式设置,如:

[cpp] view plaincopy print?
  1. dwStyle |= LVS_SHOWSELALWAYS;
  2. m_list.SetExtendedStyle(dwStyle); //设置扩展风格
dwStyle |= LVS_SHOWSELALWAYS;
m_list.SetExtendedStyle(dwStyle); //设置扩展风格

5 选中和取消一行

[cpp] view plaincopy print?
  1. int nIndex = 0;
  2. //选中
  3. m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
  4. //取消选中
  5. m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);
int nIndex = 0;
//选中
m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
//取消选中
m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);

另一种方式,包含获取选择项和设置:

[cpp] view plaincopy print?
  1. // Set the selection mark to the first item only if no other item is
  2. // selected.
  3. if (m_myListCtrl.GetSelectionMark() == -1)
  4. m_myListCtrl.SetSelectionMark(0);
// Set the selection mark to the first item only if no other item is
// selected.
if (m_myListCtrl.GetSelectionMark() == -1)m_myListCtrl.SetSelectionMark(0);

在单选时可用以上方法。

6 获取选择项

[cpp] view plaincopy print?
  1. CString str;
  2. for(int i=0; i<m_list.GetItemCount(); i++)
  3. {
  4. if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
  5. {
  6. str.Format(_T("选中了第%d行"), i);
  7. AfxMessageBox(str);
  8. }
  9. }
CString str;
for(int i=0; i<m_list.GetItemCount(); i++)
{if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ){str.Format(_T("选中了第%d行"), i);AfxMessageBox(str);}
}

另一种方法:

[cpp] view plaincopy print?
  1. POSITION pos = m_list.GetFirstSelectedItemPosition();
  2. if (pos == NULL)
  3. TRACE0("No items were selected!\n");
  4. else
  5. {
  6. while (pos)
  7. {
  8. int nItem = m_list.GetNextSelectedItem(pos);
  9. TRACE1("Item %d was selected!\n", nItem);
  10. // you could do your own processing on nItem here
  11. }
  12. }
POSITION pos = m_list.GetFirstSelectedItemPosition();
if (pos == NULL)TRACE0("No items were selected!\n");
else
{while (pos){int nItem = m_list.GetNextSelectedItem(pos);TRACE1("Item %d was selected!\n", nItem);// you could do your own processing on nItem here}
}

获取单选项的示例代码:

[cpp] view plaincopy print?
  1. POSITION pos =m_CLC_Record.GetFirstSelectedItemPosition();
  2. if (pos == NULL)
  3. {
  4. AfxMessageBox("请先选择一项记录!");
  5. return;
  6. }
  7. else
  8. {
  9. int nSel =m_CLC_Record.GetNextSelectedItem(pos);
  10. //do something
  11. }
POSITION pos =m_CLC_Record.GetFirstSelectedItemPosition();
if (pos == NULL)
{AfxMessageBox("请先选择一项记录!");return;
}
else
{int nSel =m_CLC_Record.GetNextSelectedItem(pos);//do something
}

7 绑定数据

[cpp] view plaincopy print?
  1. // If any item's data is equal to zero then reset it to -1.
  2. for (int i=0; i < m_myListCtrl.GetItemCount(); i++)
  3. {
  4. if (m_myListCtrl.GetItemData(i) == 0)
  5. {
  6. m_myListCtrl.SetItemData(i, (DWORD) -1);
  7. }
  8. }
// If any item's data is equal to zero then reset it to -1.
for (int i=0; i < m_myListCtrl.GetItemCount(); i++)
{if (m_myListCtrl.GetItemData(i) == 0){m_myListCtrl.SetItemData(i, (DWORD) -1);}
}

参考:http://www.cnblogs.com/cy163/archive/2006/10/15/529790.html

8 隐藏表头

有两种方法:

第一种:在属性面板中找到No Column Header属性,设置为true。

第二种:动态创建时使用LVS_NOCOLUMNHEADER。

9 获取总行数

[cpp] view plaincopy print?
  1. int nCount =m_myListCtr.GetItemCount();
int nCount =m_myListCtr.GetItemCount();

10 滚屏

[cpp] view plaincopy print?
  1. //滚屏
  2. m_CLC_Record.EnsureVisible(nCount-1,false);
//滚屏
m_CLC_Record.EnsureVisible(nCount-1,false);

11 双击一行

为CListCtrl添加NM_DBLCK事件.

示例代码:

[cpp] view plaincopy print?
  1. void CTestDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
  2. {
  3. LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
  4. // TODO: Add your control notification handler code here
  5. NMLISTVIEW* pMListView=(NMLISTVIEW*) pNMHDR;
  6. int nIndex = pMListView->iItem;
  7. RecordData *pdata =(RecordData *)m_CLC_Record.GetItemData(nIndex);
  8. m_ComboSendType.SetCurSel(pdata->SendFmt);
  9. m_ComboSendFrmType.SetCurSel(pdata->FrameType);
  10. m_ComboSendFrmFmt.SetCurSel(pdata->FramFmt);
  11. m_EditSendFrmID.Format("%08x",pdata->FrameID);
  12. m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);
  13. m_Delay =pdata->DelayTime;
  14. UpdateData(false);
  15. *pResult = 0;
  16. }
void CTestDlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);// TODO: Add your control notification handler code hereNMLISTVIEW* pMListView=(NMLISTVIEW*) pNMHDR;int nIndex = pMListView->iItem;RecordData *pdata =(RecordData *)m_CLC_Record.GetItemData(nIndex);m_ComboSendType.SetCurSel(pdata->SendFmt);m_ComboSendFrmType.SetCurSel(pdata->FrameType);m_ComboSendFrmFmt.SetCurSel(pdata->FramFmt);m_EditSendFrmID.Format("%08x",pdata->FrameID);m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);m_Delay =pdata->DelayTime;UpdateData(false);*pResult = 0;
}

12 获取Item字符串

[cpp] view plaincopy print?
  1. m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);
m_EditSendData =m_CLC_Record.GetItemText(nIndex,4);

CListCtrl的用法总结相关推荐

  1. CListCtrl基本用法

    CListCtrl是列表控件类,列表控件的每一行叫做一个item,每一列叫做一个subitem.每一行和每一列都有个ID号,可以确定唯一的单元格. 最近使用了这个控件,有心得总结如下: (Dialog ...

  2. CLIST 数组的用法 CListCtrl m_list 用法

    CList <CUser*,CUser*&>  m_Usermap; CListCtrl  m_list://m_list 是控件CList Control 变量名: CUser ...

  3. ClistCtrl 的用法

    1.创建create ① 绝对大小CRect(10,10,600,200) CListCtrl * list1 = new CListCtrl; list1->Create(WS_VISIBLE ...

  4. MFC 列表控件CListCtrl加载类似QQ界面的头像与文字

    本文主要讲述使用VS2012 MFC的CListCtrl(列表)控件加载类似于QQ界面的图片与文字数据.主要通过CListCtrl::InsertColumn.InsertItem.SetItemTe ...

  5. CListCtrl中的HitTest、SubItemHitTest的用法

    CListCtrl中的HitTest.SubItemHitTest的用法 2HitTest:得到当前鼠标位置的Item 其实关键是要有ScreenToClient这个函数的使用,我先前没有用这个函数, ...

  6. CListCtrl::SortItems的用法

    CListCtrl::SortItems的用法: (一)SortItems使用在哪? CListCtrl::SortItems的原型是: BOOL SortItems( PFNLVCOMPARE pf ...

  7. CListCtrl用法简介(转)

    listviewsemaphorethreadimageattributes多线程 以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SD ...

  8. MFC总结之CListCtrl用法及技巧(二)

    续第一篇:MFC总结之CListCtrl用法及技巧(一) http://blog.csdn.net/zwgdft/article/details/7560592 本篇重点介绍:禁止拖动表头.让第一列居 ...

  9. CListCtrl用法简介

    http://blog.csdn.net/lixiaosan/archive/2006/04/07/653563.aspx 以下未经说明,listctrl默认view 风格为report 相关类及处理 ...

最新文章

  1. matlab演示系统,基于Matlab的通信原理演示系统的设计与应用
  2. 产品研究分析--王者荣耀的那些套路
  3. 1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式
  4. linux spinlock/rwlock/seqlock原理剖析(基于ARM64)
  5. 未来教育计算机二级预测c,二级C语言(附光盘)(全国计算机等级考试预测试卷与真考题库)...
  6. flask第二十篇——模板【3】
  7. FreeRTOS学习笔记---任务控制块源码分析
  8. java中this的作用!
  9. TIT 计算机图形学 实验一 十二面体线框模型
  10. Git设置代理服务器
  11. Tui-editor富文本编辑器的使用
  12. code block怎样导入整个文件夹_PR怎样大批量添加字幕? 协同AE。
  13. hi3516dv300 u-boot, 内核, 文件系统编译移植
  14. Android 开源项目分类汇总(很全)
  15. Python中List遍历的若干种方法
  16. overleaf表格_LaTeX基本命令使用教程(清晰实例)(Overleaf平台)(论文排版)
  17. win7家庭版怎么升级旗舰版
  18. C51模拟PS2键盘(三)
  19. 蓝桥杯嵌入式(G4系列):RTC时钟
  20. 【容器云】Calico 组件架构

热门文章

  1. mysql1064 at line 6,MySQL错误1064语法,但一切似乎都很好
  2. 医院计算机管理在品管圈中的应用,品管圈在医院管理中怎么用?看完就明白了...
  3. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程
  4. Problems you may meet
  5. Martini源码剖析
  6. 怎样cp文件夹时忽略指定的文件夹和文件
  7. Android Studio下项目构建的Gradle配置及打包应用变体
  8. Java 中 Varargs 机制详解
  9. 225. Implement Stack using Queues
  10. java 中 针对数组进行的工具类