// 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("复制失败!"));
|
}
|
}
|