MFC中ListCtrl列表控件的使用

时间:2022-09-21 19:03:33
MFC中ListCtrl列表控件的使用                                                      Latest Edit 2013/10/24 今天花了几个小时把ListCtrl的常用的使用方法学习了一下,做了一个具体的例子来熟悉里面的函数,下图是程序的一个界面;下面与大家分享一下。 MFC中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被选中这里用到了一个状态查找函数GetItemStateGetCheck()见“删除选中项"按钮的代码
5.得到单击列表时的行列号,   这里要为ListCtrl添加一个NM_CLICK的消息响应函数,在VS2008中的操作过程,见图MFC中ListCtrl列表控件的使用
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的消息响应函数。与上面的方法一致。
MFC中ListCtrl列表控件的使用
首先在资源管理器中添加菜单,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