| | |
| | | , m_nTrayIconID(0) |
| | | , m_bTrayIconCreated(FALSE) |
| | | , m_bExitingFromTray(FALSE) |
| | | , m_nAutoStart(TRUE) |
| | | { |
| | | m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); |
| | | } |
| | |
| | | } |
| | | |
| | | m_plcListener.Stop(); |
| | | |
| | | // 保存配置文件 |
| | | SaveConfig(GetConfigPath()); |
| | | |
| | | DestroyWindow(); |
| | | CDialogEx::OnClose(); |
| | |
| | | strLine.Empty(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | CString CSGMeasurementDlg::GetAppDirectory() |
| | | { |
| | | TCHAR szPath[MAX_PATH] = { 0 }; |
| | | GetModuleFileName(NULL, szPath, MAX_PATH); |
| | | |
| | | CString strPath = szPath; |
| | | int pos = strPath.ReverseFind('\\'); |
| | | if (pos != -1) { |
| | | strPath = strPath.Left(pos + 1); |
| | | } |
| | | |
| | | return strPath; |
| | | } |
| | | |
| | | CString CSGMeasurementDlg::GetConfigPath() |
| | | { |
| | | return GetAppDirectory() + _T("SGConfig.ini"); |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::LoadConfig(const CString& strFile) |
| | | { |
| | | CString strSection = _T("StorageConfig"); |
| | | TCHAR buf[256]; |
| | | |
| | | GetPrivateProfileString(strSection, _T("UseTrigger"), _T("0"), buf, 256, strFile); |
| | | m_nUseTrigger = _ttoi(buf); |
| | | |
| | | GetPrivateProfileString(strSection, _T("SavePointCount"), _T("100000"), buf, 256, strFile); |
| | | m_nSavePointCount = _ttoi(buf); |
| | | |
| | | // 输出端口 |
| | | GetPrivateProfileString(strSection, _T("OutputPort"), _T("OUT1"), buf, 256, strFile); |
| | | { |
| | | int idx = m_comboOutputPort.FindStringExact(-1, buf); |
| | | if (idx != CB_ERR) { |
| | | m_comboOutputPort.SetCurSel(idx); |
| | | } |
| | | else { |
| | | m_comboOutputPort.SetCurSel(0); |
| | | } |
| | | } |
| | | |
| | | // 跳变检测参数 |
| | | GetPrivateProfileString(strSection, _T("JumpThreshold"), _T("0.2"), buf, 256, strFile); |
| | | m_fJumpThreshold = static_cast<float>(_tstof(buf)); |
| | | |
| | | GetPrivateProfileString(strSection, _T("JumpWindow"), _T("3"), buf, 256, strFile); |
| | | m_nJumpWindow = _ttoi(buf); |
| | | |
| | | GetPrivateProfileString(strSection, _T("ValleyMargin"), _T("0"), buf, 256, strFile); |
| | | m_nValleyMargin = _ttoi(buf); |
| | | |
| | | GetPrivateProfileString(strSection, _T("MinGlass1Count"), _T("10"), buf, 256, strFile); |
| | | m_nMinGlass1Count = _ttoi(buf); |
| | | |
| | | // 稳定区域参数 |
| | | GetPrivateProfileString(strSection, _T("FixedCount"), _T("5"), buf, 256, strFile); |
| | | m_nFixedCount = _ttoi(buf); |
| | | |
| | | GetPrivateProfileString(strSection, _T("MaxDelta"), _T("0.05"), buf, 256, strFile); |
| | | m_fMaxDelta = static_cast<float>(_tstof(buf)); |
| | | |
| | | // 自启动 |
| | | GetPrivateProfileString(strSection, _T("AutoStart"), _T("1"), buf, 256, strFile); |
| | | m_nAutoStart = _ttoi(buf); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::SaveConfig(const CString& strFile) |
| | | { |
| | | CString strSection = _T("StorageConfig"); |
| | | |
| | | WritePrivateProfileString(strSection, _T("UseTrigger"), std::to_wstring(m_nUseTrigger).c_str(), strFile); |
| | | WritePrivateProfileString(strSection, _T("SavePointCount"), std::to_wstring(m_nSavePointCount).c_str(), strFile); |
| | | |
| | | // 输出端口下拉框 |
| | | CString strPort; |
| | | m_comboOutputPort.GetWindowText(strPort); |
| | | WritePrivateProfileString(strSection, _T("OutputPort"), strPort, strFile); |
| | | |
| | | // 跳变检测 |
| | | WritePrivateProfileString(strSection, _T("JumpThreshold"), std::to_wstring(m_fJumpThreshold).c_str(), strFile); |
| | | WritePrivateProfileString(strSection, _T("JumpWindow"), std::to_wstring(m_nJumpWindow).c_str(), strFile); |
| | | WritePrivateProfileString(strSection, _T("ValleyMargin"), std::to_wstring(m_nValleyMargin).c_str(), strFile); |
| | | WritePrivateProfileString(strSection, _T("MinGlass1Count"), std::to_wstring(m_nMinGlass1Count).c_str(), strFile); |
| | | |
| | | // 稳定区 |
| | | WritePrivateProfileString(strSection, _T("FixedCount"), std::to_wstring(m_nFixedCount).c_str(), strFile); |
| | | WritePrivateProfileString(strSection, _T("MaxDelta"), std::to_wstring(m_fMaxDelta).c_str(), strFile); |
| | | |
| | | // 自启动 |
| | | WritePrivateProfileString(strSection, _T("AutoStart"), std::to_wstring(m_nAutoStart).c_str(), strFile); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::SetAutoStart(bool bEnable) |
| | | { |
| | | // 获取当前程序路径 |
| | | TCHAR szPath[MAX_PATH] = { 0 }; |
| | | GetModuleFileName(NULL, szPath, MAX_PATH); |
| | | CString strAppPath = szPath; |
| | | |
| | | // 获取应用程序名称 |
| | | CString strAppName = ::PathFindFileName(strAppPath); |
| | | strAppName = strAppName.Left(strAppName.ReverseFind('.')); |
| | | |
| | | HKEY hKey; |
| | | LONG lRet = RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_WRITE, &hKey); |
| | | |
| | | if (lRet != ERROR_SUCCESS) { |
| | | return false; |
| | | } |
| | | |
| | | if (bEnable) { |
| | | // 设置自启 |
| | | lRet = RegSetValueEx(hKey, strAppName, 0, REG_SZ, (BYTE*)(LPCTSTR)strAppPath, (strAppPath.GetLength() + 1) * sizeof(TCHAR)); |
| | | } |
| | | else { |
| | | // 取消自启 |
| | | lRet = RegDeleteValue(hKey, strAppName); |
| | | } |
| | | |
| | | RegCloseKey(hKey); |
| | | return (lRet == ERROR_SUCCESS); |
| | | } |
| | | |
| | | bool CSGMeasurementDlg::ConnectToDevice() |
| | |
| | | }); |
| | | m_plcListener.Start(); |
| | | |
| | | // 加载配置文件 |
| | | if (LoadConfig(GetConfigPath())) { |
| | | AppendLogLineRichStyled(_T("配置已从 SGConfig.ini 加载成功"), LOG_COLOR_SUCCESS); |
| | | } |
| | | else { |
| | | AppendLogLineRichStyled(_T("配置加载失败,使用默认参数"), LOG_COLOR_WARNING); |
| | | } |
| | | |
| | | // 设置自动启动 |
| | | if (SetAutoStart(m_nAutoStart)) { |
| | | if (m_nAutoStart) { |
| | | AppendLogLineRichStyled(_T("已启用开机自启动"), LOG_COLOR_SUCCESS); |
| | | } |
| | | else { |
| | | AppendLogLineRichStyled(_T("已取消开机自启动"), LOG_COLOR_WARNING); |
| | | } |
| | | } |
| | | else { |
| | | AppendLogLineRichStyled(_T("设置开机自启动失败,请检查权限"), LOG_COLOR_ERROR); |
| | | } |
| | | |
| | | // 初始化日志框 |
| | | AppendLogLineRichStyled(_T("准备就绪..."), LOG_COLOR_SUCCESS); |
| | | |