// DlgRecord.cpp: 实现文件 // #include "stdafx.h" #include "Simulator.h" #include "DlgRecord.h" #include "CSM315ProtocolEx.h" // CDlgRecord 对话框 IMPLEMENT_DYNAMIC(CDlgRecord, CDialogEx) CDlgRecord::CDlgRecord(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_RECORD, pParent) { m_bShowCmd_heartbeat = 1; InitializeCriticalSection(&m_csRecv); } CDlgRecord::~CDlgRecord() { DeleteCriticalSection(&m_csRecv); } void CDlgRecord::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_RECORD, m_lstRecord); } BEGIN_MESSAGE_MAP(CDlgRecord, CDialogEx) ON_BN_CLICKED(IDC_CHECK_SHOW_HEARTBEAT, &CDlgRecord::OnBnClickedCheckShowHeartbeat) ON_NOTIFY(NM_DBLCLK, IDC_LIST_RECORD, &CDlgRecord::OnNMDblclkList) ON_NOTIFY(NM_RCLICK, IDC_LIST_RECORD, &CDlgRecord::OnNMRClickList) ON_COMMAND(ID_LIST_CLEAR, &CDlgRecord::OnListClear) ON_COMMAND(ID_DATA_COPY, &CDlgRecord::OnDataCopy) ON_COMMAND(ID_DATA_COPYALL, &CDlgRecord::OnDataCopyAll) END_MESSAGE_MAP() // CDlgRecord 消息处理程序 BOOL CDlgRecord::OnInitDialog() { CDialogEx::OnInitDialog(); CheckDlgButton(IDC_CHECK_SHOW_HEARTBEAT, m_bShowCmd_heartbeat ? BST_CHECKED : BST_UNCHECKED); m_lstRecord.SetExtendedStyle(m_lstRecord.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); m_lstRecord.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 50); m_lstRecord.InsertColumn(1, _T("时间"), LVCFMT_LEFT, 100); m_lstRecord.InsertColumn(2, _T("地址"), LVCFMT_LEFT, 120); m_lstRecord.InsertColumn(3, _T("端口号"), LVCFMT_LEFT, 80); m_lstRecord.InsertColumn(4, _T("简单数据"), LVCFMT_LEFT, 450); m_lstRecord.InsertColumn(5, _T("原始数据"), LVCFMT_LEFT, 320); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CDlgRecord::InsertData(CString strIP, int nPort, LPBYTE lpData, int nDataSize) { auto a = lpData[7]; if (a == FRAME_TYPE_HEARTBEAT && !m_bShowCmd_heartbeat) return; //2023.5.18 新增JSON数据帧 scz EnterCriticalSection(&m_csRecv); UINT uItem = m_lstRecord.GetItemCount(); m_lstRecord.InsertItem(uItem, std::to_string(uItem + 1).c_str()); SYSTEMTIME st; GetLocalTime(&st); CString strTime; strTime.Format("%02d:%02d:%02d.%03d", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); m_lstRecord.SetItemText(uItem, 1, strTime); m_lstRecord.SetItemText(uItem, 2, strIP); m_lstRecord.SetItemText(uItem, 3, std::to_string(nPort).c_str()); m_lstRecord.SetItemText(uItem, 4, CCSM315ProtocolEx::ToString(lpData, nDataSize, RECV).c_str()); m_lstRecord.SetItemText(uItem, 5, CCSM315ProtocolEx::GetStrFromData(lpData, nDataSize).c_str()); LeaveCriticalSection(&m_csRecv); } void CDlgRecord::OnBnClickedCheckShowHeartbeat() { m_bShowCmd_heartbeat = IsDlgButtonChecked(IDC_CHECK_SHOW_HEARTBEAT) == BST_CHECKED; } void CDlgRecord::OnNMDblclkList(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); int nItem = pNMLV->iItem; int nSubItem = pNMLV->iSubItem; if (nItem != -1 && nSubItem != -1) { CString str = m_lstRecord.GetItemText(nItem, nSubItem); MessageBox(str); } *pResult = 0; } void CDlgRecord::OnNMRClickList(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; int nItem = pNMListView->iItem; int nSubItem = pNMListView->iSubItem; CListCtrl* pList = &m_lstRecord; CPoint oPoint; GetCursorPos(&oPoint); CMenu menu, * pSubMenu; menu.LoadMenu(IDR_MENU1); pSubMenu = menu.GetSubMenu(0); if (nItem == -1 || nSubItem == -1) { pSubMenu->DeleteMenu(ID_DATA_COPY, MF_BYCOMMAND); pSubMenu->DeleteMenu(ID_DATA_COPYALL, MF_BYCOMMAND); } m_nLastItem = nItem; m_nLastSubItem = nSubItem; pSubMenu->TrackPopupMenu(TPM_LEFTALIGN, oPoint.x, oPoint.y, this); *pResult = 0; } void CDlgRecord::OnDataCopy() { CListCtrl* pList = &m_lstRecord; if (m_nLastItem != -1 && m_nLastSubItem != -1) { string str = pList->GetItemText(m_nLastItem, m_nLastSubItem); if (OpenClipboard()) { HGLOBAL clipbuffer; char* buffer; EmptyClipboard(); clipbuffer = GlobalAlloc(GMEM_MOVEABLE, str.length() + 1); buffer = (char*)GlobalLock(clipbuffer); strcpy_s(buffer, str.length() + 1, str.c_str()); GlobalUnlock(clipbuffer); SetClipboardData(CF_TEXT, clipbuffer); //GlobalFree(clipbuffer); CloseClipboard(); } } } void CDlgRecord::OnDataCopyAll() { CListCtrl* pList = &m_lstRecord; if (OpenClipboard()) { CString strInfo = "", strTemp = ""; for (int i = 0; i < pList->GetItemCount(); i++) { strTemp = (LPCTSTR)(pList->GetItemText(i, 1)); strInfo += (strTemp + "\n"); } HGLOBAL clipbuffer; char* buffer; EmptyClipboard(); clipbuffer = GlobalAlloc(GMEM_MOVEABLE, (strInfo.GetLength() + 1) * 2); buffer = (char*)GlobalLock(clipbuffer); lstrcpy(buffer, strInfo); GlobalUnlock(clipbuffer); SetClipboardData(CF_TEXT, clipbuffer); CloseClipboard(); } } void CDlgRecord::OnListClear() { CListCtrl* pList = &m_lstRecord; EnterCriticalSection(&m_csRecv); m_lstRecord.DeleteAllItems(); LeaveCriticalSection(&m_csRecv); }