本文介绍列表框删除行,插入行,全部勾选,全部取消功能。
在对话框上拖入一个List Control控件,并类向导为其添加变量m_listctrl。 还是直接给代码:
BOOL CMyDlg::OnInitDialog() { CDialog::OnInitDialog(); //1 列表控件要足够宽,以便容纳5列
m_listctrl.InsertColumn(0,“编号”,LVCFMT_CENTER,100); m_listctrl.InsertColumn(1,“功能”,LVCFMT_CENTER,100); m_listctrl.InsertColumn(2,“低端”,LVCFMT_CENTER,100); m_listctrl.InsertColumn(3,“高端”,LVCFMT_CENTER,100);
m_listctrl.InsertItem(0,“sub11”); m_listctrl.SetItemText(0,1,“sub12”);
//2 修改常规风格,或者从控件的属性中 LONG lStyle; lStyle =GetWindowLong(m_listctrl.m_hWnd,GWL_STYLE); // lStyle &= ~LVS_TYPEMASK;//清除显示方式位 lStyle |= LVS_REPORT;//设置为报告风格 SetWindowLong(m_listctrl.m_hWnd,GWL_STYLE,lStyle); //3 设置扩展风格,整行选择,网格线,前面有检查框 // m_listctrl.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES); DWORD dwStyle = m_listctrl.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl) dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的listctrl) dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件 m_listctrl.SetExtendedStyle(dwStyle); //设置扩展
return TRUE; // return TRUE unless you set the focus to a control }
void CMyDlg::OnBUTTONallchk() {//全选择,即每行都打勾 BOOL bl=FALSE; for (int i=0;i {//全选择,即每行都打勾 // bl=m_listctrl.SetItemState(i,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED); m_listctrl.SetCheck(i); } }
void CMyDlg::OnBUTTONallnochk() {//全不选择,即每行都 不打勾 for (int i=0;i {//全不选择,即每行都 不打勾 // m_listctrl.SetItemState(i,0,LVIS_SELECTED|LVIS_FOCUSED); m_listctrl.SetCheck(i,FALSE); } }
void CMyDlg::OnBUTTONallchkdel() {//删除选择的所有行 int ok= AfxMessageBox( “确认删除选择的所有行吗?”, MB_YESNO); if (ok!=IDYES) {return;} m_list.SetRedraw(FALSE); //不刷新内容 for (int i=m_listctrl.GetItemCount()-1; i>=0; i–) {//倒序删除勾选的行,比较简单,虽然有其它方法 if( m_listctrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED || m_listctrl.GetCheck(i)) { m_listctrl.DeleteItem(i); } }
m_list.SetRedraw(TRUE); //恢复刷新 m_list.Invalidate(); m_list.UpdateWindow(); }
void CMyDlg::OnBUTTONdelcur() {//只删除当前行 // TODO: Add your control notification handler code here int ok= AfxMessageBox( “确认删除当前行吗?”, MB_YESNO); if (ok!=IDYES) {return;} m_list.SetRedraw(FALSE); //更新内容
for (int i=m_listctrl.GetItemCount()-1; i>=0; i–) { if( m_listctrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )//当前点击的行 { m_listctrl.DeleteItem(i); break;//只删除当前行,所以删除就退出 } } m_list.SetRedraw(TRUE); m_list.Invalidate(); m_list.UpdateWindow(); }
void CMyDlg::OnBUTTONinsertcur() {当前行之“前”插入 // TODO: Add your control notification handler code here int nIndex = m_listctrl.GetItemCount();//默认插入到最后
for (int i=m_listctrl.GetItemCount()-1; i>=0; i–) { if( m_listctrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ) { nIndex=i;//当前行之前插入 break;//找到当前行,就退出 } }
LV_ITEM lvitemAdd = {0}; lvitemAdd.mask = LVIF_TEXT; lvitemAdd.iItem = nIndex ; lvitemAdd.iSubItem = 0; lvitemAdd.pszText =_T(“第1列”);; if (m_listctrl.InsertItem(&lvitemAdd) != -1) { LV_ITEM lvitem = {0}; lvitem.mask = LVIF_TEXT; lvitem.iItem = nIndex ; lvitem.iSubItem = 1; lvitem.pszText =_T(“第2列”); m_listctrl.SetItem(&lvitem); } }
void CMyDlg::OnBUTTONinsertcurafter() {//当前行之“后”插入 int nIndex = m_listctrl.GetItemCount();//默认插入到最后 for (int i=m_listctrl.GetItemCount()-1; i>=0; i–) { if( m_listctrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED ) { nIndex=i;//当前行之前插入 nIndex++;//下一行,当前行之后插入 break;//找到当前行,就退出 } } LV_ITEM lvitemAdd = {0}; lvitemAdd.mask = LVIF_TEXT; lvitemAdd.iItem = nIndex ; lvitemAdd.iSubItem = 0;//第1列 lvitemAdd.pszText =_T(“第1列”);; if (m_listctrl.InsertItem(&lvitemAdd) != -1) { LV_ITEM lvitem = {0}; lvitem.mask = LVIF_TEXT; lvitem.iItem = nIndex ; lvitem.iSubItem = 1; //第2列 lvitem.pszText =_T(“第2列”); m_listctrl.SetItem(&lvitem); } }