实现单个列表的不同样式多选复制后,只需要封装一下函数就可以了
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();
}
}
}