1.VC STATIC控件响应鼠标点击事件
将notify设置为true。
双击控件即可自动创建点击事件函数,如void CRecPlotDlg::OnStnClickedWavePwm()
2.建立文件夹和文件/保存文件
#include "shlwapi.h"
#pragma comment(lib,"shlwapi.lib")
CString filepath = pDlg->m_str_edit_client;
if (!PathIsDirectory(filepath))
{
::CreateDirectory(filepath, NULL);//创建目录,已有的话不影响
}
filepath += _T("\\") + pDlg->m_str_edit_site + _T("-") + pDlg->m_str_edit_prodid;
if (!PathIsDirectory(filepath))
{
::CreateDirectory(filepath, NULL);//创建目录,已有的话不影响
}
CFile fileSave;
CTime time = CTime::GetCurrentTime();
str.Format(_T("%d"),rec_num_cur);
BOOL success = fileSave.Open(filepath + _T("\\") + pDlg->m_str_edit_client + _T("-") + pDlg->m_str_edit_site + _T("-") + pDlg->m_str_edit_prodid + _T("-") +time.Format("%Y%m%d")+_T("-rec")+str+_T(".data"),CFile::modeCreate | CFile::modeWrite);
if(success==0){
pDlg->m_str_edit_output += _T("打开/新建保存文件,失败!\r\n");
pDlg->SendMessage(WM_REFRESH_UI);
ThreadEnd(pDlg,&Proc2Running,TRUE);
return 0;
}
CArchive ar(&fileSave, CArchive::store);
for(int n=0;n<8192;n++)
{
ar<<modbus_data_reorder[n];
}
ar.Close();
fileSave.Close();
3.按键打开另一个窗口
CRecPlotDlg dlgRecPlot;
dlgRecPlot.DoModal();
4.获取可用的COM口
#include <devguid.h>
/*
GUID_DEVCLASS_FDC软盘控制器
GUID_DEVCLASS_DISPLAY显示卡
GUID_DEVCLASS_CDROM光驱
GUID_DEVCLASS_KEYBOARD键盘
GUID_DEVCLASS_COMPUTER计算机
GUID_DEVCLASS_SYSTEM系统
GUID_DEVCLASS_DISKDRIVE磁盘驱动器
GUID_DEVCLASS_MEDIA声音、视频和游戏控制器
GUID_DEVCLASS_MODEMMODEM
GUID_DEVCLASS_MOUSE鼠标和其他指针设备
GUID_DEVCLASS_NET网络设备器
GUID_DEVCLASS_USB通用串行总线控制器
GUID_DEVCLASS_FLOPPYDISK软盘驱动器
GUID_DEVCLASS_UNKNOWN未知设备
GUID_DEVCLASS_SCSIADAPTERSCSI 和 RAID 控制器
GUID_DEVCLASS_HDCIDE ATA/ATAPI 控制器
GUID_DEVCLASS_PORTS端口(COM 和 LPT)
GUID_DEVCLASS_MONITOR监视器
*/
void EnumerCOMPortByGUID(LPVOID lpParameter)
{
Crec_readDlg * pDlg = (Crec_readDlg *)lpParameter;
HDEVINFO hDevInfo = SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS, NULL, NULL, 0);
HANDLE hCom;
if (hDevInfo)
{
int iy = 0;
SP_DEVINFO_DATA SpDevInfo = { sizeof(SP_DEVINFO_DATA) };
CString ComY[50];
CString ComYanzheng;
for (DWORD iDevIndex = 0; SetupDiEnumDeviceInfo(hDevInfo, iDevIndex, &SpDevInfo); iDevIndex++)
{
TCHAR szName[512] = { 0 };
if (SetupDiGetDeviceRegistryProperty(hDevInfo, &SpDevInfo, SPDRP_FRIENDLYNAME,
NULL, (PBYTE)szName, sizeof(szName), NULL))
{
CString com, str, strComOpen;
str.Format(_T("%s"), szName);//获取串口的名称COM2
int posBeg = str.Find('(');
int posEnd = str.Find(')');
com = str.Mid(posBeg + 1, posEnd - posBeg - 1);//获取串口的名称COM2
strComOpen = _T("\\\\.\\") + com;
hCom = CreateFile(strComOpen, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);//如果返回不为空则此串口可用
if (INVALID_HANDLE_VALUE == hCom || ComYanzheng == com)
{
DWORD error = ::GetLastError();//取得错误信息
}
else
{
ComYanzheng = com;
ComY[iy] = str;
iy++;
}
CloseHandle(hCom);
}
}
SetupDiDestroyDeviceInfoList(hDevInfo);
//显示可用串口
pDlg->m_ctl_com_port.Clear();
for(int n=0;n<50;n++)
{
if(ComY[n].IsEmpty()) continue;
pDlg->m_ctl_com_port.AddString(ComY[n]);
}
}
}
5.点击打开文件选择对话框
char strExt[5] = "data";//设置文件的读取类型
CString szFilter = _T("Data Files (*.data)|*.data|All Files (*.*)|*.*||");
SelectFile(strExt,szFilter);
bool Crec_readDlg::SelectFile(char* strExt,CString const& szFilter)
{
CFileDialog dlg(TRUE,(LPCTSTR)strExt,NULL,OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT,szFilter);
dlg.m_ofn.lpstrTitle = _T("请选择缓存文件");
CString inPath;
CArray<CString,CString> aryFilename;
if(dlg.DoModal() == IDOK)
{
CString filenames;
POSITION posFile = dlg.GetStartPosition();
while(posFile != NULL)
{
aryFilename.Add(dlg.GetNextPathName(posFile));
}
}
int SelFileNum = aryFilename.GetSize();
if(SelFileNum==0)
{
this->m_str_edit_output += _T("没有选择缓存文件");
return false;
}else{
this->m_str_edit_recfile = *aryFilename.GetData();
this->UpdateData(FALSE);
}
return true;