MFC中ListCtrl列表控件的使用

来源:互联网 发布:艾佛森生涯数据 编辑:程序博客网 时间:2024/04/30 06:22
MFC中ListCtrl列表控件的使用
                                                     Latest Edit 2013/10/24
今天花了几个小时把ListCtrl的常用的使用方法学习了一下,做了一个具体的例子来熟悉里面的函数,下图是程序的一个界面;下面与大家分享一下。

先说明一下,建立工程文件中有关细节,如果有同学想跟着做一下也比较方便一点
            工程名为:ListCtrl,基于Dialog,其他默认。
            控件名与变量名的对应关系,我们从系统我们自动生成的函数中可以看到,
            列表控件:           IDC_LIST, 变量名为control变量 m_listCtrl
            三个EDIT控件
                             姓名: IDC_NAME,变量名为CString类型m_strName
                             学号: IDC_SN    ,变量名为CString类型m_strSN
                             年龄: IDC_AGE , 变量名为CString类型m_nAge
void CListCtrlDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST, m_listCtrl);DDX_Text(pDX, IDC_NAME, m_strName);DDX_Text(pDX, IDC_SN, m_strSN);DDX_Text(pDX, IDC_AGE, m_nAge);DDX_Text(pDX, IDC_SelColumn, m_strColumn);}
           两个BUTTON
           添加: IDC_OK  ,  对应的函数
void CListCtrlDlg::OnBnClickedOk()(UpdateData(TRUE);// TODO: 在此添加控件通知处理程序代码if (m_strName.IsEmpty()||m_strSN.IsEmpty()||m_nAge.IsEmpty()){MessageBox(_T("信息不完整"));return;}m_listCtrl.InsertItem(m_nCount,m_strName);m_listCtrl.SetItemText(m_nCount,1,m_strSN);m_listCtrl.SetItemText(m_nCount,2,m_nAge);        m_strName.Empty();m_strSN.Empty();        m_nAge.Empty();UpdateData(FALSE);)               
       删除选中项:IDC_Del,
void CListCtrlDlg::OnBnClickedDel(){// TODO: 在此添加控件通知处理程序代码   CString str;   for (int i=0;i<m_listCtrl.GetItemCount();i++)   {   if (m_listCtrl.GetCheck(i)||m_listCtrl.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED)   {   str.Format(_T("%d被选中将被删除"),i+1);   MessageBox(str);   m_listCtrl.DeleteItem(i);   m_nCount--; //用来统计列表有多少项,在头文件中有定义 it m_nCount,在构造函数中初始化为0   }   }}
1.首先是ListCtrl中标题行的添加,里面涉及到一个函数,函数原型如下
int InsertColumn{int nCol,                           //表示列的索引LPCTSTR lpszColumnHeading,         //也就是如姓名,年龄等文字int nFormat=LVCFMT_LEFT,           //对齐方式,默认是左对齐int nWidth=-1,                     //表格的宽度,单位为像素int nSubItem=-1                    //与列相关的字项索引}
 

2,设置ListCtrl风格的函数SetExtendStyle

LVS_EX_FULLROWSELECT     //选中时行会高亮显示LVS_EX_GRIDLINES         // 打上网格,默认是没有的LVS_EX_CHECKBOXES        // 在第一行最前面有一个Checkbox

结合上面两个函数,做了一个ListCtrl的初始化函数
void CListCtrlDlg:: InitListCtrl(){m_listCtrl.InsertColumn(0,_T("姓名"),LVCFMT_LEFT,100);m_listCtrl.InsertColumn(1,_T("学号"),LVCFMT_LEFT,100);m_listCtrl.InsertColumn(2,_T("年龄"),LVCFMT_LEFT,50);DWORD dwStyle=m_listCtrl.GetExtendedStyle();dwStyle|=LVS_EX_FULLROWSELECT;dwStyle|=LVS_EX_GRIDLINES;dwStyle|=LVS_EX_CHECKBOXES;m_listCtrl.SetExtendedStyle(dwStyle);}

在函数中 BOOL CListCtrlDlg::OnInitDialog()调用上面函数

3.在ListCtrl中添加数据,涉及到两个函数,它们有多种重载方式,我这里就用了其中最常用的,感兴趣的可以去MSDN中查找。
这两个函数要结合使用,只能先用 InsertItem,然后再用SetItemText。在IDC_OK中有使用,前面有代码。
int InsertItem(  int nItem,   //所在行索引   LPCTSTR lpszItem //要写入的数据);BOOL SetItemText( int nItem,              //所在行 int nSubItem,        //所在列 LPTSTR lpszText //要写入的数据 );


4. 查找列表中哪些行中的checkbox被选中
这里用到了一个状态查找函数
GetItemState
GetCheck()
见“删除选中项"按钮的代码

5.得到单击列表时的行列号,
   这里要为ListCtrl添加一个NM_CLICK的消息响应函数,在VS2008中的操作过程,见图

void CListCtrlDlg::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult){DWORD dwPos = GetMessagePos();                 CPoint point( LOWORD(dwPos), HIWORD(dwPos) );m_listCtrl.ScreenToClient(&point);LVHITTESTINFO lvinfo;lvinfo.pt = point;lvinfo.flags = LVHT_ABOVE;int nItem = m_listCtrl.SubItemHitTest(&lvinfo);if(nItem != -1){m_strColumn.Format(_T("%d"),lvinfo.iItem);UpdateData(FALSE);}}
6.在列表中右键,弹出菜单,这里也要为ListCtrl添加一个NM_RCLIK的消息响应函数。与上面的方法一致。

首先在资源管理器中添加菜单,IDC_MENU,然后为其中的菜单项添加响应函数中再次调用前面所用的删除函数。
void CListCtrlDlg::OnNMRClickList(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_MENU));CMenu *popup=menu.GetSubMenu(0);ASSERT(popup!=NULL);popup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);*pResult=0;}}
 想近一步学习的话,可以在参考以下两篇文章
http://blog.csdn.net/miaoxiyu/article/details/7312102#
http://www.cnblogs.com/lidabo/archive/2012/08/23/2652786.html


原创粉丝点击