首页 > 代码库 > MFC CListCtrl 将一个列表的选中项添加到另一个列表
MFC CListCtrl 将一个列表的选中项添加到另一个列表
MFC CListCtrl 将一个列表的选中项添加到另一个列表, 用VC6.0实现:
简单记录一下自己的学习历程, 和大家分享,如果对你有用,我很高兴。
1、新建一个基于对话框的工程(Dialog-Based)
1.1 新建项目
打开VC6.0 -> File -> New -> Projects -> MFC AppWizard[exe] -> 工程名CListCtrlEg -> 点击OK
->Dialog based -> Finish -> OK
1.2 添加控件CListCtrl
选择资源视图(ResourceView) -> Dialog -> 双击选中我们自己创建好的Dialog, 添加如下内容
两个列表控件(ListControl):
ID: IDC_LIST_LEFT Styles->View->设置为Report
ID: IDC_LIST_RIGHT Styles->View->设置为Report
将CListCtrl控件关联两个成员变量:
选中控件,右键点击ClassWizard -> Member Variables选项卡 -> Add Variable -> 填写变量名 ->【最后点击Ok】
这样在类中就会自动产生两个CListCtrl的对象与控件相关联,并且在DoDataExchange()函数中会增加两行代码,表示控件与成员相关联。
另外我们需要增加一个整形的计数器m_indexLeft, 作为左边的CListCtrl 项的下标,初始化为-1:
添加代码进行测试:在BOOL CCListCtrlEgDlg::OnInitDialog()中 //TODO后面添加代码
1 // TODO: Add extra initialization here 2 // 设置左边控件 3 m_listCtrlLeft.SetTextColor(RGB(0,0,255)); 4 m_listCtrlLeft.SetExtendedStyle(m_listCtrlLeft.GetExtendedStyle()|LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES); 5 m_listCtrlLeft.InsertColumn(0, _T("Day"),LVCFMT_CENTER,55); 6 m_listCtrlLeft.InsertColumn(1, _T("Name"),LVCFMT_CENTER,100); 7 8 // 设置右边控件 - 后面添加的 9 m_listCtrlRight.SetTextColor(RGB(0,0,255));10 m_listCtrlRight.SetExtendedStyle(m_listCtrlRight.GetExtendedStyle()|LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES);11 m_listCtrlRight.InsertColumn(0, _T("Day"),LVCFMT_CENTER,55);12 m_listCtrlRight.InsertColumn(1, _T("Name"),LVCFMT_CENTER,100);13 14 // 向左边的ListCtrl添加数据15 m_indexLeft++;16 17 m_listCtrlLeft.InsertItem(m_indexLeft,"Day1");18 m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Monday");19 20 m_listCtrlLeft.InsertItem(m_indexLeft,"Day2");21 m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Tuesday");22 23 m_listCtrlLeft.InsertItem(m_indexLeft,"Day3");24 m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Wednesday");25 26 m_listCtrlLeft.InsertItem(m_indexLeft,"Day4");27 m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Thursday");28 29 m_listCtrlLeft.InsertItem(m_indexLeft,"Day5");30 m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Friday");31 32 m_listCtrlLeft.InsertItem(m_indexLeft,"Day6");33 m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Saturday");34 35 m_listCtrlLeft.InsertItem(m_indexLeft,"Day7");36 m_listCtrlLeft.SetItemText(m_indexLeft++,1,"Sunday");37 38 SetWindowLong(m_listCtrlLeft.m_hWnd ,GWL_EXSTYLE,WS_EX_CLIENTEDGE);39 m_listCtrlLeft.SetExtendedStyle(LVS_EX_GRIDLINES); //设置左边控件扩展风格为网格40 ::SendMessage(m_listCtrlLeft.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,41 LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);42 43 SetWindowLong(m_listCtrlRight.m_hWnd ,GWL_EXSTYLE,WS_EX_CLIENTEDGE);44 m_listCtrlRight.SetExtendedStyle(LVS_EX_GRIDLINES); //设置右边控件扩展风格为网格 - 后面添加的45 ::SendMessage(m_listCtrlRight.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,46 LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
效果如下:
1.3 添加按钮和文本框
a)两个静态文本框(Static Text):
ID: IDC_STATIC Caption: Days in a week
ID: IDC_STATIC Caption: Choose days to have a rest
b)四个按钮Button
ID: IDC_BTN_ADD Caption:> // 添加选中项
ID: IDC_BTN_ADDALL Caption:>> // 全部添加
ID: IDC_BTN_DEL Caption:< // 删除选中项
ID: IDC_BTN_DELALL Caption:>> // 删除全部
运行效果如下图所示:
2、实现功能
我们可以分别双击控件,添加相应的响应函数
2.1 添加选中项CCListCtrlEgDlg::OnBtnAdd()
1 void CCListCtrlEgDlg::OnBtnAdd() 2 { 3 // TODO: Add your control notification handler code here 4 TCHAR szBuf[100]; 5 /* memset(szBuf, 0, sizeof(szBuf));*/ 6 // LVITEM 数据结构, 用来获取CListCtrl的列表项的值 7 LVITEM lvi; 8 lvi.pszText = szBuf; //存放item的文本内容 9 lvi.iItem = -1; //索引下标10 lvi.iSubItem = 0;11 lvi.mask = LVIF_TEXT;12 lvi.cchTextMax = 1024;13 14 CString str;15 for(int i = 0; i < m_listCtrlLeft.GetItemCount(); i++) 16 {17 if (LVIS_SELECTED == m_listCtrlLeft.GetItemState(i, LVIS_SELECTED))18 {19 lvi.iItem = i;20 m_listCtrlLeft.GetItem(&lvi);21 22 TCHAR szBuf2[100];23 // 增加一个查重的功能, 同样需要一个LVITEM的结构用来从右边的m_listCtrlRight取值进行比较24 LVITEM lvi2;25 lvi2.pszText = szBuf2; //存放item的文本内容26 lvi2.iItem = -1; //索引下标27 lvi2.iSubItem = 0;28 lvi2.mask = LVIF_TEXT;29 lvi2.cchTextMax = 1024;30 31 for(int j = 0; j < m_listCtrlRight.GetItemCount(); j++) 32 {33 lvi2.iItem = j; //一条条表项进行比较34 m_listCtrlRight.GetItem(&lvi2);35 36 if(!strcmp(lvi.pszText, lvi2.pszText)) //如果左边选中的表项跟右边有重复,则不添加到右边了37 {38 m_flag = FALSE;39 break;40 }41 }42 if(m_flag) 43 {44 m_indexRight++;45 m_listCtrlRight.InsertItem(m_indexRight, szBuf);46 m_listCtrlRight.SetItemText(m_indexRight, 1, m_listCtrlLeft.GetItemText(i, 1));47 }48 m_flag = TRUE;49 }50 }51 }
这里我们需要添加两个成员变量:
int m_indexRight = -1; // 右边CListCtrl控件的下标
BOOL m_flag = TRUE; // 判断右边控件中是否已经存在选中的项
另外还需要在CCListCtrlSampleDlg::OnInitDialog()中对右边控件进行一些设置, 在前面的代码中已经设置好了。
运行结果展示如下:
2.2 添加全部CCListCtrlEgDlg::OnBtnAddall()
1 void CCListCtrlEgDlg::OnBtnAddall() 2 { 3 // TODO: Add your control notification handler code here 4 //有两种方式实现 5 // m_listCtrlRight.DeleteAllItems(); //删除全部项 6 // m_indexRight = -1; // 重置下标 7 8 OnBtnDelall(); // 调用后面的函数删除全部项 9 10 TCHAR szBuf[100];11 LVITEM lvi;12 lvi.pszText = szBuf; //存放item的文本内容13 lvi.iItem = -1; //索引下标14 lvi.iSubItem = 0;15 lvi.mask = LVIF_TEXT;16 lvi.cchTextMax = 1024;17 18 CString str;19 for(int i = 0; i < m_listCtrlLeft.GetItemCount(); i++) 20 {21 lvi.iItem = i;22 m_listCtrlLeft.GetItem(&lvi);23 24 m_indexRight++;25 m_listCtrlRight.InsertItem(m_indexRight, szBuf);26 m_listCtrlRight.SetItemText(m_indexRight, 1, m_listCtrlLeft.GetItemText(i, 1));27 }28 }
2.3 删除选中项CCListCtrlEgDlg::OnBtnDel()
1 void CCListCtrlEgDlg::OnBtnDel() 2 { 3 // 逆序判断,主要是因为在删除的时候表项的数量是会变动的 4 for(int i = m_listCtrlRight.GetItemCount(); i > -1; i--) 5 { 6 if (LVIS_SELECTED == m_listCtrlRight.GetItemState(i, LVIS_SELECTED)) 7 { 8 m_listCtrlRight.DeleteItem(i); 9 m_indexRight--;10 }11 } 12 }
2.4 删除全部CCListCtrlEgDlg::OnBtnDelall()
1 void CCListCtrlEgDlg::OnBtnDelall() 2 {3 m_listCtrlRight.DeleteAllItems(); // 删除全部项4 m_indexRight = -1; // 重置下标5 }
运行效果如下:
3、源码:
百度云分享:链接: https://pan.baidu.com/s/1bYN3WE 密码: r7ky
MFC CListCtrl 将一个列表的选中项添加到另一个列表