先说明一下,建立工程文件中有关细节,如果有同学想跟着做一下也比较方便一点 工程名为: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)两个BUTTON 添加: IDC_OK , 对应的函数
{
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);
}
void CListCtrlDlg::OnBnClickedOk()删除选中项:IDC_Del,
(
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);
)
void CListCtrlDlg::OnBnClickedDel()1.首先是ListCtrl中标题行的添加,里面涉及到一个函数,函数原型如下
{
// 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
}
}
}
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中的操作过程,见图
void CListCtrlDlg::OnNMClickList(NMHDR *pNMHDR, LRESULT *pResult)6.在列表中右键,弹出菜单,这里也要为ListCtrl添加一个NM_RCLIK的消息响应函数。与上面的方法一致。
{
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);
}
}
首先在资源管理器中添加菜单,IDC_MENU,然后为其中的菜单项添加响应函数中再次调用前面所用的删除函数。
void CListCtrlDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult)想近一步学习的话,可以在参考以下两篇文章http://blog.csdn.net/miaoxiyu/article/details/7312102#
{
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://www.cnblogs.com/lidabo/archive/2012/08/23/2652786.html