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后面添加代码
// 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
MFC CListCtrl 将一个列表的选中项添加到另一个列表的更多相关文章
- 复制SharePoint列表项(SPListItem)到另一个列表
从理论上讲,有一个简单到难以置信的解决办法:SPListItem提供了一个CopyTo(destinationUrl)方法(可参考MSDN).不幸的是,这个方法似乎用不了.至少对我的情况(一个带附件的 ...
- html 把左框的选中项添加到右框
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【VS开发】MFC CListCtrl列表控件的消息响应
MFC里的CListCtrl选中一行,消息是哪个.实在想不起来了.找了一篇文章,比较有用: http://www.cnblogs.com/hongfei/archive/2012/12/25/2832 ...
- 每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询
前言: 前一段时间一直都比较忙,没有什么时间进行总结,刚好节前项目上线,同时趁着放假可以好好的对之前遇到的一些问题进行总结.主要内容有使用SharePoint服务端对象模型进行查询.为SharePoi ...
- 使用mobile jQuery 动态给select下拉添加数据,选中项默认不显示的解决方法。
getaddress(); function getaddress(type=0,parent='') { var tid=1; $.ajax({ type: "post", ur ...
- 如何给MFC的菜单项添加快捷键
我们一起分享,如何给MFC的菜单项添加快捷键.[程序在VC6.0编译环境下编译通过.(VS2010的编译环境大同小异)] 1.程序演示环境 1.1新建一个[对话框(Dialog)]的程序.然后,New ...
- VS2010 MFC中 给菜单项添加消息响应函数
久了没用,居然忘记了该怎样给菜单项添加响应函数了~~~~~~~~T_T 特记于此: 1. 在资源视图的Menu里找到自己要添加的菜单,然后输入菜单项. 2. 右击菜单项选属性,设置Popup为Fals ...
- VS2010/MFC对话框四:为控件添加消息处理函数
为控件添加消息处理函数 创建对话框类和添加控件变量在上一讲中已经讲过,这一讲的主要内容是如何为控件添加消息处理函数. MFC为对话框和控件等定义了诸多消息,我们对它们操作时会触发消息,这些消息最终由消 ...
- [MFC] 对话框菜单项Menu选中打勾(单选,多选)
近期需要实现一个功能:MFC对话框中,一项菜单下有五个菜单项,改变菜单项选中状态,每次只能选择其中一个打勾.(单选) 然后在网上搜了下资料,稍微总结下,以防后面用到. 1.单选实现: CMenu* m ...
随机推荐
- UML之Enterprise Architect使用
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:UML之Enterprise Architect使用 本文地址:http://tech ...
- 个人项目----词频统计WEB(部分功能)
需求分析 1.使用web上传txt文件,对上传的txt进行词频统计. 2.将统计后的结果输出到web页面,力求界面优美. 3.在界面上展示所给url的文章词频统计,力求界面优美. 3.将每个单词同四. ...
- Python2 读取表格类型文件
resp = My_Request_Get(xls_url) # My_Request_Get是我自己封装的请求函数,可修改为requests请求f = ]) nrows = table._dimnr ...
- 第204天:js---重载和多态
一.根据arguments个数实现重载 js本身不支持重载,所以只能通过其他方式实现,arguments检测传参的个数,然后再执行不同的方式 function add() { var sum = 0 ...
- python的N个小功能(高斯模糊原理及实践)
原理: 二维高斯函数 1) 为了计算权重矩阵,需要设定σ的值.假定σ=1.5,则模糊半径为1的权重矩阵如下: 2) 这9个点的权重总和等于0.4787147,如果只计算 ...
- BZOJ4925 城市规划
对每个人行道求出移动距离在哪些区间内时其在建筑物前面.现在问题即为选一个点使得其被最多的区间包含.差分即可.对建筑暴力去掉重叠部分.开始时没有去重用了nm次vector的push_back,时间大概是 ...
- 洛谷 P4116 Qtree3
Qtree系列第三题 我是题面 读完题大概不难判断是一道树剖的题 这道题的关键是记录两种状态,以及黑点的序号(不是编号) 线段树啊当然 定义两个变量v,f,v表示距离根节点最近的黑点,默认-1,f则表 ...
- 输入三个数a,b,n,输出a和b不大于n的公倍数的个数
题:输入三个数a,b,n,输出a和b不大于n的公倍数的所有个数. 这题的思想是先求得a和b的最大公约数,然后用a和b的积除以最大公约数,得到最小公倍数,再持续加上最小公倍数,直到超过n,记下n的个数. ...
- 服务器版“永恒之蓝”高危预警 (Samba远程命令执行漏洞CVE-2017-7494) 攻击演示
漏洞信息: 2017年5月24日Samba发布了4.6.4版本,中间修复了一个严重的远程代码执行漏洞,漏洞编号CVE-2017-7494,漏洞影响了Samba 3.5.0 之后到4.6.4/4.5.1 ...
- Hibernate持久化对象修改id重新保存的办法
Hibernate持久化对象修改id重新保存的办法——Hibernate学习记录二 2017年11月10日 20:16:48 筱光 阅读数:1122 版权声明:本文为博主原创文章,未经博主允许不得 ...