MFC:ListControl用法

以下未经说明,ListControl默认view风格为report。

1. 设置CListControl风格

  1. LVS_ICON:为每个Item显示大图标;
  2. LVS_SMALLICON:为每个Item显示小图标;
  3. LVS_LIST:显示一列带有小图标的Item;
  4. LVS_REPORT:显示Item详细资料。

直观的理解:windows资源管理器,"查看"标签下的"大图标,小图标,列表,详细资料。

2. 设置ListControl风格及扩展风格

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

DWORD dwStyle = m_list.GetExtendedStyle();

dwStyle |= LVS_EX_FULLROWSELECT;// 选中某行使整行高亮(只适用与report 风格的ListControl )

dwStyle |= LVS_EX_GRIDLINES;// 网格线(只适用与report 风格的ListControl )

dwStyle |= LVS_EX_CHECKBOXES;//Item前生成checkbox 控件

m_list.SetExtendedStyle(dwStyle); // 设置扩展风格

【注】listview的style请查阅msdn。

3. 插入数据

m_list.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );// 插入列

m_list.InsertColumn( 1, "NAME", LVCFMT_LEFT, 50 );

// 新插入的在上面

int nRow = m_list.InsertItem(0, "11");// 插入行

m_list.SetItemText(nRow, 1, "jacky");// 设置其它列数据

// 新插入的数据在下面

int nIndex = m_list.GetItemCount();

LV_ITEMlvItem;

lvItem.mask = LVIF_TEXT ;

lvItem.iItem= nIndex;  //行数

lvItem.iSubItem= 0;

lvItem.pszText = (char*)(LPCTSTR)strCount;//第一列

// 在最后一行插入记录值.

m_list.InsertItem(&lvItem);

// 插入其它列

m_list.SetItemText(nIndex,1,strLat);

4. 一直选中Item

选中style中的Show selection always,或者在上面第2点中设置LVS_SHOWSELALWAYS

5. 选中和取消选中一行

int nIndex = 0;

// 选中

m_list.SetItemState(nIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);

// 取消选中

m_list.SetItemState(nIndex, 0, LVIS_SELECTED|LVIS_FOCUSED);

6. 得到ListControl中所有行的checkbox的状态

m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);

CString str;

for(int i=0; i<m_list.GetItemCount(); i++)

{

if( m_list.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_list.GetCheck(i))

{

str.Format(_T(" 第%d 行的checkbox 为选中状态"), i);

AfxMessageBox(str);

}

}

7. 得到ListControl中所有选中行的序号

方法1

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

}

}

方法2

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 nItemhere

}

}

8. 得到Item的信息

TCHAR szBuf[1024];

LVITEMlvi;

lvi.iItem= nItemIndex;

lvi.iSubItem= 0;

lvi.mask = LVIF_TEXT;

lvi.pszText = szBuf;

lvi.cchTextMax = 1024;

m_list.GetItem(&lvi);

// 关于得到设置Item的状态,还可以参考msdn文章

9. 得到ListControl的所有列的header字符串内容

LVCOLUMN lvcol;

charstr[256];

intnColNum;

CStringstrColumnName[4];// 假如有4 列

nColNum = 0;

lvcol.mask = LVCF_TEXT;

lvcol.pszText = str;

lvcol.cchTextMax = 256;

while(m_list.GetColumn(nColNum, &lvcol))

{

strColumnName[nColNum] = lvcol.pszText;

nColNum++;

}

10. 使ListControl滚动滚动条到最后

m_list.EnsureVisible(i, FALSE);

11. 得到ListControl列数

int nHeadNum = m_list.GetHeaderCtrl()->GetItemCount();

12. 删除所有列

方法1

while ( m_list.DeleteColumn (0))

因为你删除了第一列后,后面的列会依次向上移动。

方法2

int nColumns = 4;

for (int i=nColumns-1; i>=0; i--)

m_list.DeleteColumn (i);

13. 得到单击的ListControl的行列号

添加ListControl控件的NM_CLICK消息相应函数:

void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)

{

// 方法1

/*

DWORD dwPos = GetMessagePos();

CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

m_list.ScreenToClient(&point);

LVHITTESTINFO lvinfo;

lvinfo.pt = point;

lvinfo.flags = LVHT_ABOVE;

int nItem= m_list.SubItemHitTest(&lvinfo);

if(nItem!= -1)

{

CString strtemp;

strtemp.Format(" 单击的是第%d 行第%d 列", lvinfo.iItem, lvinfo.iSubItem);

AfxMessageBox(strtemp);

}

*/

// 方法2

/*

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

if(pNMListView->iItem!= -1)

{

CString strtemp;

strtemp.Format(" 单击的是第%d 行第%d 列",

pNMListView->iItem, pNMListView->iSubItem);

AfxMessageBox(strtemp);

}

*/

*pResult = 0;

}

14. 判断是否点击在ListControl的checkbox上

添加ListControl控件的NM_CLICK消息相应函数:

void CTest6Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)

{

DWORD dwPos = GetMessagePos();

CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

m_list.ScreenToClient(&point);

LVHITTESTINFO lvinfo;

lvinfo.pt = point;

lvinfo.flags = LVHT_ABOVE;

UINT nFlag;

int nItem= m_list.HitTest(point, &nFlag);

// 判断是否点在checkbox 上

if(nFlag == LVHT_ONITEMSTATEICON)

{

AfxMessageBox(" 点在ListControl 的checkbox 上");

}

*pResult = 0;

}

15. 右键点击ListControl的Item弹出菜单

添加ListControl控件的NM_RCLICK 消息相应函数:

void CTest6Dlg::OnRclickList1(NMHDR* pNMHDR, LRESULT* pResult)

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

if(pNMListView->iItem!= -1)

{

DWORD dwPos = GetMessagePos();

CPoint point( LOWORD(dwPos), HIWORD(dwPos) );

CMenu menu;

VERIFY( menu.LoadMenu( IDR_MENU1 ) );

CMenu* popup = menu.GetSubMenu(0);

ASSERT( popup != NULL );

popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this );

}

*pResult = 0;

}

16. Item

切换焦点时(包括用键盘和鼠标切换Item时),状态的一些变化顺序。

添加ListControl控件的LVN_ITEMCHANGED消息相应函数:

void CTest6Dlg::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult)

{

NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

// TODO:Add your control notification handler code here

CString sTemp;

if((pNMListView->uOldState & LVIS_FOCUSED) == LVIS_FOCUSED && (pNMListView->uNewState & LVIS_FOCUSED) == 0)

{

sTemp.Format("%d losted focus",pNMListView->iItem);

}

else if((pNMListView->uOldState & LVIS_FOCUSED) == 0 &&

(pNMListView->uNewState & LVIS_FOCUSED) == LVIS_FOCUSED)

{

sTemp.Format("%d got focus",pNMListView->iItem);

}

if((pNMListView->uOldState & LVIS_SELECTED) == LVIS_SELECTED &&

(pNMListView->uNewState & LVIS_SELECTED) == 0)

{

sTemp.Format("%d losted selected",pNMListView->iItem);

}

else if((pNMListView->uOldState & LVIS_SELECTED) == 0 && (pNMListView->uNewState & LVIS_SELECTED) == LVIS_SELECTED)

{

sTemp.Format("%d got selected",pNMListView->iItem);

}

*pResult = 0;

17. 选中listview中的Item

How To Select a Listview Item Programmatically

http://support.microsoft.com/kb/131284/en-us

18. 如何在CListView中使用CListControl的派生类

http://www.codeguru.com/cpp/controls/listview/introduction/article.php/c919/

19. ListControl的subItem添加图标

m_list.SetExtendedStyle(LVS_EX_SUBITEMIMAGES);

m_list.SetItem(..); // 具体参数请参考msdn

MFC:ListControl用法相关推荐

  1. MFC ListControl InsertItem与SetItemText

    MFC ListControl InsertItem与SetItemText list.InsertItem(int 行数, LPCTSTR 字符串); list.SetItemText(int 行数 ...

  2. MFC:ListControl数据修改

    ListControl数据修改 1.创建对话框及必要的控件 2.表格格式设计 3.表格数据修改 ①双击表格选中cell实现数值修改 ②cell实现数值修改后保存 1.创建对话框及必要的控件 创建对话框 ...

  3. MFC——ComBox用法大全

    (1):先看第一篇:        CComBox控件使用方法 CComBox控件在MFC编程经常使用到.主要涉及到几个功能: 1.值的插入,这通常会使用两种方法 1) int AddString( ...

  4. MFC 定时器用法 SetTimer、KillTimer

    什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了. 使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以 ...

  5. MFC TabCtrl用法

    基于对话框的MFC程序, 在主对话框中添加TabCtrl控件,CTabCtrl 类型的变量m_tabctrl; 插入3对话框,并设置属性style=Child,Border=None,创建三个对话框类 ...

  6. C++ MFC listcontrol简单例子参考

    // AutoPlayDlg.cpp : 实现文件 // #include "stdafx.h" #include "AutoPlay.h" #include ...

  7. MFC——AfxParseURL用法

    1.功能: 该函数解析URL字符串并返回服务的类型及组件,包含在 afxinet.h 头文件中. 2.定义 BOOL AFXAPI AfxParseURL(LPCTSTRpstrURL,DWORD&a ...

  8. MFC RadioButton用法详解

    基础介绍: radio button通常都是成组使用的,在一组里面是互斥的. 分组的原则是: 1.首先将RadioButton控件定好Tab顺序,具体方法:工具栏"格式"-> ...

  9. mfc ListControl 重绘网格线

    .h文件 //网格线设置 [yal 2013.10.08]  int        m_nGridStyle;      //风格 PS_DASH,PS_SOLID,...  COLORREF   m ...

最新文章

  1. mysql date_trunc_com.mysql.jdbc.MysqlDataTruncation: Data trunca...
  2. linux fish,LINUX命令fishshell-系统管理-比bash更好用的shell
  3. 目标跟踪从0到1:算法与实践
  4. Code Review工具Jupiter介绍
  5. Unity3D学习笔记(七):叉乘和四元素
  6. 如何使用新的Apache Http Client发出HEAD请求
  7. Tomcat报错:ERROR:transport error 202: gethostbyname: unknown host
  8. python实现二分查找算法
  9. 计算机组成原理学习通题目汇总
  10. ONENOTE注册CSDN
  11. 利用kali Linux破解WiFi密码
  12. 服务器不能用pe安装win7系统安装,WinPE无法安装win7系统的完美解决方案
  13. angular uibpagination 分页相关
  14. sin级数展开c语言,三角函数sin的泰勒级数展开
  15. 智能音箱音效哪个好_四大智能音箱,你觉得哪个才是最好用的?
  16. 图表示学习之时序的事件和节点动态
  17. js中动态获取页面的高度和宽度的方法总结
  18. 一个近乎完美的 Unity 全平台热更方案
  19. Android开发示例
  20. Juniper初始化之配置管理接口

热门文章

  1. oracle中spool导出数据小结
  2. MongoDB多条件分组聚合查询
  3. android 简单对话框实现
  4. 数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器...
  5. ListView优化机制及滑动时数据时出现的数据错乱重复问题
  6. FPGA相关术语(一)
  7. eclispe dev tools
  8. Mac下配置多个SSH-Key (gitLab)
  9. 整理struct sockaddr和struct sockaddr_in
  10. #9 case while until select语句的运用与例子