在listctrl按ctrl键选了四五个item,我想得到我所选的item的顺序. 请教高手指点下... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用一个数组,长度等于listctrl的数据个数,每次点击listctrl时,入队(把数组当做队列来用),然后你就可以根据所选的个数,知道他们的顺序。大体思路这样,具体你自己完善,不明白大家讨论。 for( i = 0; i < m_list2.GetItemCount(); i++ ){ if( LVIS_SELECTED == m_list2.GetItemState( i, LVIS_SELECTED ) ) 我响应了 LVN_ITEMCHANGED .也定义了一个类成员变量 CPtrList ptrSelList; 每次响应 首先判断这个item在不在这个链里面,如过不在,就把此item加到这个链里面.如过在的话,就把这个item从链中删除.(就相当于按ctrl键在一个ITEM上点一下,是选种.再点一下,就是不选种)按道理这种思路应该是对的啊..可是我发现,按CTRL键盘之后.这问题就出先了...不 能按照我上面预期的来.请教大家,还有什么更好的办法不??? 我是想得到我按ctrl键盘,所选的item的选择顺序..如,有五个item 1,2,3,4,5 我按ctrl键盘,点1,再点2再点1,再点3 我所选的item应该是23 .顺序是2-3 可是就如同我回复 1楼的,我处理LVN_ITEMCHANGED 消息时,按住ctrl键盘,选则的时候,.消息响应有点混乱,不是按照我预期的来的。 处理NM_CLICK消息:#include <vector>using namespace std;vector<int> vec;void CXXXDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) { NMLISTVIEW* pList = (NMLISTVIEW*)pNMHDR; int nRow = pList->iItem; BOOL bDel = TRUE; if(LVIS_SELECTED == m_list.GetItemState(nRow, LVIS_SELECTED)) { bDel = FALSE; vec.push_back(nRow); } if(bDel) { for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++) { if(nRow == *iter) { vec.erase(iter); break; } } } *pResult = 0;}// 然后查看if(!vec.empty()) { CString strText(_T("Your select: ")); CString strTemp(_T("")); for(vector<int>::const_iterator iter = vec.begin(); iter != vec.end(); iter++) { strTemp.Format(_T("%d, "), *iter); strText += strTemp; } AfxMessageBox(strText); } 在list的NM_CLICK里做记录建立一个点击表响应一次NM_CLICK就把当前先做的项的序号记录在表里记录的时候从头遍历表中的现有项如果遇到相同的就将其删除同时此次不执行添加操作 楼主,果然是这样,我也试过,不知是不是MFC有BUG,就算不按CTRL,用鼠标点一下,SELCHANGE的消息居然会执行三几次,真是晕啊. 嘎嘎 最简单的方法最有效list中再增加一列 显示状态,比如: 选中顺序[1..N]/未选中要一个变量num 记录最近一次的index例如:选5 选3 选5 选8 选12 选7 选8最终 for 1 to row 遍历 获取状态 就OK啦 我起初也是这么想的,但有个问题,就是我有时按ctrl键选,有时不按ctrl键选.如果我不按ctrl键盘,我选1,选2,选3,选4.其实我只选择了4. 但我的记录集中会出现1,2,3,4. 这做法不对..如果,我一直按住ctrl键,这样还行...但如果我一会按一会不按...不按ctrl的时候,.比如我选择了 1,,把1加到链里,然后我选择了,2,还会把2加到链里,而把1没有删除. 这就是你处理按不按Ctrl键的问题了两种按键方式 分别处理嘛~ 确实是我欠考虑我记得这种组合功能件在LButtonDown中一个参数可以识别是不是可以考虑重载ListCtrl处理OnLButtonDown 你在click的时候加个判断ctrl键有没有按下,如果没有按下,就将vector清空void CXXXDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) { NMLISTVIEW* pList = (NMLISTVIEW*)pNMHDR; int nRow = pList->iItem; BOOL bDel = TRUE; if(!(HIBYTE(GetKeyState(VK_CONTROL)))) { vec.clear(); } if(LVIS_SELECTED == m_list.GetItemState(nRow, LVIS_SELECTED)) { bDel = FALSE; vec.push_back(nRow); } if(bDel) { for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++) { if(nRow == *iter) { vec.erase(iter); break; } } } *pResult = 0;} if(!(HIBYTE(GetKeyState(VK_CONTROL)))) { vec.clear(); }判断ctrl键有没有按下 十分感谢 VisualEleven 以下方法正解,目前测试没发现bug.特别好用.可以结帖了.void CXXXDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult) { NMLISTVIEW* pList = (NMLISTVIEW*)pNMHDR; int nRow = pList->iItem; BOOL bDel = TRUE; if(!(HIBYTE(GetKeyState(VK_CONTROL)))) { vec.clear(); } if(LVIS_SELECTED == m_list.GetItemState(nRow, LVIS_SELECTED)) { bDel = FALSE; vec.push_back(nRow); } if(bDel) { for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++) { if(nRow == *iter) { vec.erase(iter); break; } } } *pResult = 0;} 添加鼠标点击,要怎么做呢 关于发送消息方式模拟鼠标键盘事件操作问题? 为什么不弄个窗口的构造函数,让它自己来Create和ShowWindow呢? 请教利用VC的多文档如何建立一个工程带有多个界面?(请注意,不是建立一个多视图的界面) 多文档,主框架的边框,标题栏,如何自绘? 异步套接字与同步套接字 基于dialog工程,如何使用dll里的资源? 多个dialog box之间通信问题 给我个算法,急急急 请教:SHBrowseForFolder如何使用 求高手指点,visual sutdio 2010出现的错误 oxc控件 滚轮事件?
{
if( LVIS_SELECTED == m_list2.GetItemState( i, LVIS_SELECTED ) )
也定义了一个类成员变量 CPtrList ptrSelList;
每次响应 首先判断这个item在不在这个链里面,如过不在,就把此item加到这个链里面.如过在的话,就把这个item从链中删除.(就相当于按ctrl键在一个ITEM上点一下,是选种.再点一下,就是不选种)按道理这种思路应该是对的啊..可是我发现,按CTRL键盘之后.这问题就出先了...不 能按照我上面预期的来.请教大家,还有什么更好的办法不???
我是想得到我按ctrl键盘,所选的item的选择顺序..如,有五个item 1,2,3,4,5 我按ctrl键盘,点1,再点2再点1,再点3 我所选的item应该是23 .顺序是2-3
using namespace std;vector<int> vec;void CXXXDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW* pList = (NMLISTVIEW*)pNMHDR;
int nRow = pList->iItem; BOOL bDel = TRUE; if(LVIS_SELECTED == m_list.GetItemState(nRow, LVIS_SELECTED))
{
bDel = FALSE;
vec.push_back(nRow);
} if(bDel)
{
for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
{
if(nRow == *iter)
{
vec.erase(iter);
break;
}
}
} *pResult = 0;
}// 然后查看
if(!vec.empty())
{
CString strText(_T("Your select: "));
CString strTemp(_T(""));
for(vector<int>::const_iterator iter = vec.begin(); iter != vec.end(); iter++)
{
strTemp.Format(_T("%d, "), *iter);
strText += strTemp;
}
AfxMessageBox(strText);
}
建立一个点击表
响应一次NM_CLICK就把当前先做的项的序号记录在表里
记录的时候从头遍历表中的现有项
如果遇到相同的就将其删除同时此次不执行添加操作
要一个变量num 记录最近一次的index
例如:
选5 选3 选5 选8 选12 选7 选8最终 for 1 to row 遍历 获取状态 就OK啦
我起初也是这么想的,但有个问题,就是我有时按ctrl键选,有时不按ctrl键选.如果我不按ctrl键盘,我选1,选2,选3,选4.其实我只选择了4. 但我的记录集中会出现1,2,3,4.
这就是你处理按不按Ctrl键的问题了
两种按键方式 分别处理嘛~
确实是我欠考虑
我记得这种组合功能件在LButtonDown中一个参数可以识别
是不是可以考虑重载ListCtrl处理OnLButtonDown
{
NMLISTVIEW* pList = (NMLISTVIEW*)pNMHDR;
int nRow = pList->iItem;
BOOL bDel = TRUE; if(!(HIBYTE(GetKeyState(VK_CONTROL))))
{
vec.clear();
}
if(LVIS_SELECTED == m_list.GetItemState(nRow, LVIS_SELECTED))
{
bDel = FALSE;
vec.push_back(nRow);
}
if(bDel)
{
for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
{
if(nRow == *iter)
{
vec.erase(iter);
break;
}
}
}
*pResult = 0;
}
{
vec.clear();
}
判断ctrl键有没有按下
可以结帖了.
void CXXXDlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW* pList = (NMLISTVIEW*)pNMHDR;
int nRow = pList->iItem;
BOOL bDel = TRUE; if(!(HIBYTE(GetKeyState(VK_CONTROL))))
{
vec.clear();
}
if(LVIS_SELECTED == m_list.GetItemState(nRow, LVIS_SELECTED))
{
bDel = FALSE;
vec.push_back(nRow);
}
if(bDel)
{
for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); iter++)
{
if(nRow == *iter)
{
vec.erase(iter);
break;
}
}
}
*pResult = 0;
}