多个列表多选行复制

实现单个列表的不同样式多选复制后,只需要封装一下函数就可以了

1.void ScanDlg::OnMiddleRightclkListSubprocess(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    // TODO: 在此添加控件通知处理程序代码
    LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    int index = pNMLV->iItem;

    POSITION pos = m_listMiddlePos->GetFirstSelectedItemPosition();
    if (pos != NULL)
    {
        nFirstItem = m_listMiddlePos->GetNextSelectedItem(pos);//第一个被选中的的行号
        int nNextItem = 0;    //记下一个被选中的的行号
        nCheck.clear();
        while (-1 != (nNextItem = m_listMiddlePos->GetNextSelectedItem(pos)))//两次点击选中连续多个
        {
            nCheck.push_back(nNextItem);
            nFinishItem = nNextItem;
        }
    }
    if (index == -1)//没有被选中的
        return;
    HMENU hMenu = ::CreatePopupMenu();
    AppendMenu(hMenu, MF_STRING, 10001, _T("复制X轴数据"));
    //    AppendMenu(hMenu, MF_STRING, 10002, _T("复制Y轴数据"));
    AppendMenu(hMenu, MF_STRING, 10003, _T("复制Z轴数据"));
    CPoint pt;
    GetCursorPos(&pt); //获得当前鼠标位置
    UINT Cmd = (UINT)::TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RETURNCMD, pt.x, pt.y, 0, m_hWnd, NULL);//弹出菜单

    switch (Cmd)//响应点击的菜单
    {
    case 10001:
        OnCopyNcolumnMsg(m_listMiddlePos,0);//复制m_listMiddlePos列表第0列选中行数据
        break;
    case 10002:
        break;
    case 10003:
        OnCopyNcolumnMsg(m_listMiddlePos, 2);
        break;
    }
    *pResult = 0;
}

2.void OnCopyNcolumnMsg(CListCtrl *ListCopy,int column);//多选N行复制ListCopy这个列表的第column列数据
void ScanDlg::OnCopyNcolumnMsg(CListCtrl *ListCopy,int column)
{
    CString                strAisMsg;
    int                    nItem;

    TCHAR                *pszData;
    HGLOBAL                hClipboardData;
    vector<int> nCopy;
    nCopy.clear();
    for (int j = 0; j < nCheck.size(); j++)
    {
        if (nCheck[j + 1] == nCheck[j] + 1)//有连续被选中(连续蓝色)的情况
        {
            //单击几下挨着但不连选的情况
            nCopy.push_back(nCheck[j]);
            continue;

            //仅单击两下,全部连选的情况
            nItem = nFinishItem - nFirstItem + 1;
            for (int i = 0; i < nItem; i++)
            {
                strAisMsg += ListCopy->GetItemText(nFirstItem + i, column) + _T("\n");//把列表指针和列数变为参数传进来就可以了
            }
            break;
        }
        else
        {
            nCopy.push_back(nCheck[j]);
            if (nCopy.size()<nCheck.size())
            {
                continue;
            }
            else
            {
                strAisMsg += ListCopy->GetItemText(nFirstItem, column) + _T("\n");
                for (int i = 0; i < nCopy.size(); i++)
                {
                    strAisMsg += ListCopy->GetItemText(nCopy[i], column) + _T("\n");
                }
            }
        }
    }

    //复制剪切板
    if (!strAisMsg.IsEmpty())
    {
        if (OpenClipboard())
        {
            EmptyClipboard();
            hClipboardData = GlobalAlloc(GMEM_DDESHARE, (strAisMsg.GetLength() + 1) * sizeof(TCHAR));
            if (hClipboardData)
            {
                pszData = (TCHAR *)GlobalLock(hClipboardData);
                _tcscpy(pszData, strAisMsg);
                GlobalUnlock(hClipboardData);
                SetClipboardData(CF_UNICODETEXT, hClipboardData);
            }

            CloseClipboard();
        }
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值