请教高手指点下...

解决方案 »

  1.   

    使用一个数组,长度等于listctrl的数据个数,每次点击listctrl时,入队(把数组当做队列来用),然后你就可以根据所选的个数,知道他们的顺序。大体思路这样,具体你自己完善,不明白大家讨论。
      

  2.   

    for( i = 0; i < m_list2.GetItemCount(); i++ )
    {
    if( LVIS_SELECTED == m_list2.GetItemState( i, LVIS_SELECTED ) )
      

  3.   

    我响应了 LVN_ITEMCHANGED .
    也定义了一个类成员变量 CPtrList ptrSelList;
     
    每次响应 首先判断这个item在不在这个链里面,如过不在,就把此item加到这个链里面.如过在的话,就把这个item从链中删除.(就相当于按ctrl键在一个ITEM上点一下,是选种.再点一下,就是不选种)按道理这种思路应该是对的啊..可是我发现,按CTRL键盘之后.这问题就出先了...不 能按照我上面预期的来.请教大家,还有什么更好的办法不???
          
      

  4.   


    我是想得到我按ctrl键盘,所选的item的选择顺序..如,有五个item  1,2,3,4,5  我按ctrl键盘,点1,再点2再点1,再点3  我所选的item应该是23 .顺序是2-3  
      

  5.   

     可是就如同我回复 1楼的,我处理LVN_ITEMCHANGED  消息时,按住ctrl键盘,选则的时候,.消息响应有点混乱,不是按照我预期的来的。
      

  6.   

    处理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);
    }
      

  7.   

    在list的NM_CLICK里做记录
    建立一个点击表
    响应一次NM_CLICK就把当前先做的项的序号记录在表里
    记录的时候从头遍历表中的现有项
    如果遇到相同的就将其删除同时此次不执行添加操作
      

  8.   

    楼主,果然是这样,我也试过,不知是不是MFC有BUG,就算不按CTRL,用鼠标点一下,SELCHANGE的消息居然会执行三几次,真是晕啊.
      

  9.   

    嘎嘎 最简单的方法最有效list中再增加一列 显示状态,比如: 选中顺序[1..N]/未选中
    要一个变量num 记录最近一次的index
    例如:
    选5 选3 选5 选8 选12 选7 选8最终 for 1 to row 遍历 获取状态 就OK啦
      

  10.   


    我起初也是这么想的,但有个问题,就是我有时按ctrl键选,有时不按ctrl键选.如果我不按ctrl键盘,我选1,选2,选3,选4.其实我只选择了4. 但我的记录集中会出现1,2,3,4.
      

  11.   

    这做法不对..如果,我一直按住ctrl键,这样还行...但如果我一会按一会不按...不按ctrl的时候,.比如我选择了 1,,把1加到链里,然后我选择了,2,还会把2加到链里,而把1没有删除.
      

  12.   


    这就是你处理按不按Ctrl键的问题了
    两种按键方式 分别处理嘛~
      

  13.   


    确实是我欠考虑
    我记得这种组合功能件在LButtonDown中一个参数可以识别
    是不是可以考虑重载ListCtrl处理OnLButtonDown
      

  14.   

    你在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;
    }
      

  15.   

    if(!(HIBYTE(GetKeyState(VK_CONTROL))))
        {
            vec.clear();
        }

    判断ctrl键有没有按下
      

  16.   

    十分感谢 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;
    }