// CProcessDataListDlg.cpp: 实现文件 // #include "stdafx.h" #include "Servo.h" #include "CProcessDataListDlg.h" #include "afxdialogex.h" // CProcessDataListDlg 对话框 IMPLEMENT_DYNAMIC(CProcessDataListDlg, CDialogEx) CProcessDataListDlg::CProcessDataListDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_PROCESS_DATA_LIST, pParent) { } CProcessDataListDlg::~CProcessDataListDlg() { } void CProcessDataListDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_RECIPE_PARAM, m_listCtrl); } BEGIN_MESSAGE_MAP(CProcessDataListDlg, CDialogEx) ON_BN_CLICKED(IDC_BUTTON1, &CProcessDataListDlg::OnBnClickedButton1) END_MESSAGE_MAP() // CProcessDataListDlg 消息处理程序 BOOL CProcessDataListDlg::OnInitDialog() { CDialogEx::OnInitDialog(); DWORD dwStyle = m_listCtrl.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT; dwStyle |= LVS_EX_GRIDLINES; dwStyle |= LVS_EX_DOUBLEBUFFER; m_listCtrl.SetExtendedStyle(dwStyle); HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1); ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL); m_listCtrl.InsertColumn(0, _T("名称"), LVCFMT_RIGHT, 188); m_listCtrl.InsertColumn(1, _T("值"), LVCFMT_LEFT, 128); InsertParamsToListCtrl(m_listCtrl, m_strRawText); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CProcessDataListDlg::setRawText(CString& strRawText) { m_strRawText = strRawText; } void CProcessDataListDlg::InsertParamsToListCtrl(CListCtrl& listCtrl, const CString& data) { // 清空现有内容 listCtrl.DeleteAllItems(); int row = 0; int start = 0; CString item; // 按逗号分割 while (AfxExtractSubString(item, data, row, ',')) // row 从 0 开始,逐个取子串 { int pos = item.Find(_T(':')); if (pos == -1) { row++; continue; } CString name = item.Left(pos); CString value = item.Mid(pos + 1); name.Trim(); // 去掉前后空格 value.Trim(); int nItem = listCtrl.InsertItem(row, name); // 第一列:参数名 listCtrl.SetItemText(nItem, 1, value); // 第二列:参数值 row++; } } bool CProcessDataListDlg::CopyListCtrlToClipboard(CListCtrl& listCtrl, bool includeHeader/* = false*/) { CString strCSV; int nCount = listCtrl.GetItemCount(); int nColCount = listCtrl.GetHeaderCtrl()->GetItemCount(); if (nCount == 0 || nColCount == 0) return false; // 如果需要导出表头 if (includeHeader) { CString headerLine; for (int j = 0; j < nColCount; j++) { CString text; LVCOLUMN col; TCHAR buf[256] = { 0 }; col.mask = LVCF_TEXT; col.pszText = buf; col.cchTextMax = 255; if (listCtrl.GetColumn(j, &col)) text = col.pszText; if (text.Find(_T(',')) != -1 || text.Find(_T('"')) != -1) { text.Replace(_T("\""), _T("\"\"")); text = _T("\"") + text + _T("\""); } headerLine += text; if (j < nColCount - 1) headerLine += _T(","); } strCSV += headerLine + _T("\n"); } // 遍历行 for (int i = 0; i < nCount; i++) { CString line; for (int j = 0; j < nColCount; j++) { CString text = listCtrl.GetItemText(i, j); // 如果包含逗号或双引号,加上引号并转义 if (text.Find(_T(',')) != -1 || text.Find(_T('"')) != -1) { text.Replace(_T("\""), _T("\"\"")); text = _T("\"") + text + _T("\""); } line += text; if (j < nColCount - 1) line += _T(","); } strCSV += line + _T("\n"); } if (!OpenClipboard()) return false; EmptyClipboard(); // 转为全局内存 HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, (strCSV.GetLength() + 1) * sizeof(TCHAR)); if (!hMem) { CloseClipboard(); return false; } LPTSTR pMem = (LPTSTR)GlobalLock(hMem); if (!pMem) { GlobalFree(hMem); CloseClipboard(); return false; } _tcscpy_s(pMem, strCSV.GetLength() + 1, strCSV); GlobalUnlock(hMem); #ifdef UNICODE SetClipboardData(CF_UNICODETEXT, hMem); #else SetClipboardData(CF_TEXT, hMem); #endif CloseClipboard(); return true; } void CProcessDataListDlg::OnBnClickedButton1() { if (CopyListCtrlToClipboard(m_listCtrl, true)) { AfxMessageBox(_T("复制成功!")); } else { AfxMessageBox(_T("复制失败!")); } }