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后面添加代码

 // TODO: Add extra initialization here
// 设置左边控件
m_listCtrlLeft.SetTextColor(RGB(,,));
m_listCtrlLeft.SetExtendedStyle(m_listCtrlLeft.GetExtendedStyle()|LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES);
m_listCtrlLeft.InsertColumn(, _T("Day"),LVCFMT_CENTER,);
m_listCtrlLeft.InsertColumn(, _T("Name"),LVCFMT_CENTER,); // 设置右边控件 - 后面添加的
m_listCtrlRight.SetTextColor(RGB(,,));
m_listCtrlRight.SetExtendedStyle(m_listCtrlRight.GetExtendedStyle()|LVS_EX_GRIDLINES | LVS_EX_CHECKBOXES);
m_listCtrlRight.InsertColumn(, _T("Day"),LVCFMT_CENTER,);
m_listCtrlRight.InsertColumn(, _T("Name"),LVCFMT_CENTER,);

// 向左边的ListCtrl添加数据
m_indexLeft++; m_listCtrlLeft.InsertItem(m_indexLeft,"Day1");
m_listCtrlLeft.SetItemText(m_indexLeft++,,"Monday"); m_listCtrlLeft.InsertItem(m_indexLeft,"Day2");
m_listCtrlLeft.SetItemText(m_indexLeft++,,"Tuesday"); m_listCtrlLeft.InsertItem(m_indexLeft,"Day3");
m_listCtrlLeft.SetItemText(m_indexLeft++,,"Wednesday"); m_listCtrlLeft.InsertItem(m_indexLeft,"Day4");
m_listCtrlLeft.SetItemText(m_indexLeft++,,"Thursday"); m_listCtrlLeft.InsertItem(m_indexLeft,"Day5");
m_listCtrlLeft.SetItemText(m_indexLeft++,,"Friday"); m_listCtrlLeft.InsertItem(m_indexLeft,"Day6");
m_listCtrlLeft.SetItemText(m_indexLeft++,,"Saturday"); m_listCtrlLeft.InsertItem(m_indexLeft,"Day7");
m_listCtrlLeft.SetItemText(m_indexLeft++,,"Sunday"); SetWindowLong(m_listCtrlLeft.m_hWnd ,GWL_EXSTYLE,WS_EX_CLIENTEDGE);
m_listCtrlLeft.SetExtendedStyle(LVS_EX_GRIDLINES); //设置左边控件扩展风格为网格
::SendMessage(m_listCtrlLeft.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,
LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); SetWindowLong(m_listCtrlRight.m_hWnd ,GWL_EXSTYLE,WS_EX_CLIENTEDGE);
m_listCtrlRight.SetExtendedStyle(LVS_EX_GRIDLINES); //设置右边控件扩展风格为网格 - 后面添加的
::SendMessage(m_listCtrlRight.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,
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()

 void CCListCtrlEgDlg::OnBtnAdd()
{
// TODO: Add your control notification handler code here
TCHAR szBuf[];
/* memset(szBuf, 0, sizeof(szBuf));*/
// LVITEM 数据结构, 用来获取CListCtrl的列表项的值
LVITEM lvi;
lvi.pszText = szBuf; //存放item的文本内容
lvi.iItem = -; //索引下标
lvi.iSubItem = ;
lvi.mask = LVIF_TEXT;
lvi.cchTextMax = ; CString str;
for(int i = ; i < m_listCtrlLeft.GetItemCount(); i++)
{
if (LVIS_SELECTED == m_listCtrlLeft.GetItemState(i, LVIS_SELECTED))
{
lvi.iItem = i;
m_listCtrlLeft.GetItem(&lvi); TCHAR szBuf2[];
// 增加一个查重的功能, 同样需要一个LVITEM的结构用来从右边的m_listCtrlRight取值进行比较
LVITEM lvi2;
lvi2.pszText = szBuf2; //存放item的文本内容
lvi2.iItem = -; //索引下标
lvi2.iSubItem = ;
lvi2.mask = LVIF_TEXT;
lvi2.cchTextMax = ; for(int j = ; j < m_listCtrlRight.GetItemCount(); j++)
{
lvi2.iItem = j; //一条条表项进行比较
m_listCtrlRight.GetItem(&lvi2); if(!strcmp(lvi.pszText, lvi2.pszText)) //如果左边选中的表项跟右边有重复,则不添加到右边了
{
m_flag = FALSE;
break;
}
}
if(m_flag)
{
m_indexRight++;
m_listCtrlRight.InsertItem(m_indexRight, szBuf);
m_listCtrlRight.SetItemText(m_indexRight, , m_listCtrlLeft.GetItemText(i, ));
}
m_flag = TRUE;
}
}
}

这里我们需要添加两个成员变量:

int m_indexRight = -1;        // 右边CListCtrl控件的下标

BOOL m_flag = TRUE;         // 判断右边控件中是否已经存在选中的项

另外还需要在CCListCtrlSampleDlg::OnInitDialog()中对右边控件进行一些设置, 在前面粗体显示的代码中已经设置好了。 

运行结果展示如下:

2.2 添加全部CCListCtrlEgDlg::OnBtnAddall()

 void CCListCtrlEgDlg::OnBtnAddall()
{
// TODO: Add your control notification handler code here
//有两种方式实现
// m_listCtrlRight.DeleteAllItems(); //删除全部项
// m_indexRight = -1; // 重置下标 OnBtnDelall(); // 调用后面的函数删除全部项 TCHAR szBuf[];
LVITEM lvi;
lvi.pszText = szBuf; //存放item的文本内容
lvi.iItem = -; //索引下标
lvi.iSubItem = ;
lvi.mask = LVIF_TEXT;
lvi.cchTextMax = ; CString str;
for(int i = ; i < m_listCtrlLeft.GetItemCount(); i++)
{
lvi.iItem = i;
m_listCtrlLeft.GetItem(&lvi); m_indexRight++;
m_listCtrlRight.InsertItem(m_indexRight, szBuf);
m_listCtrlRight.SetItemText(m_indexRight, , m_listCtrlLeft.GetItemText(i, ));
}
}

2.3 删除选中项CCListCtrlEgDlg::OnBtnDel()

 void CCListCtrlEgDlg::OnBtnDel()
{
// 逆序判断,主要是因为在删除的时候表项的数量是会变动的
for(int i = m_listCtrlRight.GetItemCount(); i > -; i--)
{
if (LVIS_SELECTED == m_listCtrlRight.GetItemState(i, LVIS_SELECTED))
{
m_listCtrlRight.DeleteItem(i);
m_indexRight--;
}
}
}

2.4 删除全部CCListCtrlEgDlg::OnBtnDelall()

 void CCListCtrlEgDlg::OnBtnDelall()
{
m_listCtrlRight.DeleteAllItems(); // 删除全部项
m_indexRight = -; // 重置下标
}

运行效果如下:

3、源码:

百度云分享:链接: https://pan.baidu.com/s/1bYN3WE 密码: r7ky

最新文章

  1. emberjs学习二(ember-data和localstorage_adapter)
  2. UVa 四叉树
  3. 【Android Demo】获取指定网页的页面源代码
  4. PRML Chapter 2. Probability Distributions
  5. java build path-&gt;source folder分析
  6. hdu3911 线段树 区间合并
  7. Django中的Model(字段)
  8. Unity3D基础学习 NGUI Example 7-Scroll View(Panel)制作固定包裹栏,点击传递参数显示物体
  9. 【转】mysql中文乱码的一点理解
  10. JMeter脚本java代码String数组要写成String[] args,不能写成String args[],否则报错。
  11. 如何编写 PL/SQL 程序
  12. js 中arguments,call,apply,bind的使用
  13. spring datasource jdbc 密码 加解密
  14. vue中使用html2canvas及解决html2canvas截屏图片模糊问题
  15. javascript篇-知道value值,返回对象中的key值
  16. python学习之ansible api
  17. 多进程编程之用户ID和用户组ID
  18. animatescroll.min.js ~~~~ jq滚动效果 优化target自定义方法
  19. ExtJs 3 自定义combotree
  20. SVN错误:Attempted to lock an already-locked dir及不能提交.so文件

热门文章

  1. Windows下多线程编程(一)
  2. session,cookie
  3. 在python3中使用urllib.request编写简单的网络爬虫
  4. 搭建属于自己的NuGet服务器
  5. 51nod 1674 区间的价值V2(思维+拆位+尺取法)
  6. Java 读取Excel2007 jar包冲突的问题(org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException)
  7. BZOJ4892 Tjoi2017dna(后缀数组)
  8. 洛谷 P1987 摇钱树
  9. Check Corners HDU - 2888(二维RMQ)
  10. [BZOJ4540][HNOI2016]序列 莫队