| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 | // 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<LPNMLISTVIEW>(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);}
 |