// Servo.cpp : 定义应用程序的类行为。 // #include "stdafx.h" #include "Servo.h" #include "ServoDlg.h" #include "ServoGraph.h" #include "AlarmManager.h" #include "TransferManager.h" #include "SystemLogManager.h" #include "UserManager.h" #include "RecipeManager.h" #include "VerticalLine.h" #include "HorizontalLine.h" #include "EqsGraphWnd.h" #include "MapPosWnd.h" #include "HmTab.h" #include "CControlJobManagerDlg.h" // 声明全局变量,用于管理 GDI+ 初始化 ULONG_PTR g_diplusToken; GdiplusStartupInput g_diplusStartupInput; #ifdef _DEBUG #define new DEBUG_NEW #endif // CServoApp BEGIN_MESSAGE_MAP(CServoApp, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() // CServoApp 构造 CServoApp::CServoApp() { // 支持重新启动管理器 m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART; // TODO: 在此处添加构造代码, // 将所有重要的初始化放置在 InitInstance 中 m_nVersionNumber = 8; m_strVersionName = _T("1.0.08"); } // 唯一的一个 CServoApp 对象 CServoApp theApp; // CServoApp 初始化 BOOL CServoApp::InitInstance() { // TODO: 调用 AfxInitRichEdit2() 以初始化 richedit2 库。\n" // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。 否则,将无法创建窗口。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // 将它设置为包括所有要在应用程序中使用的 // 公共控件类。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); AfxEnableControlContainer(); // 创建 shell 管理器,以防对话框包含 // 任何 shell 树视图控件或 shell 列表视图控件。 CShellManager *pShellManager = new CShellManager; // 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题 CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); // 标准初始化 // 如果未使用这些功能并希望减小 // 最终可执行文件的大小,则应移除下列 // 不需要的特定初始化例程 // 更改用于存储设置的注册表项 // TODO: 应适当修改该字符串, // 例如修改为公司或组织名 SetRegistryKey(_T("应用程序向导生成的本地应用程序")); // 本程序文件目录 TCHAR sDrive[_MAX_DRIVE]; TCHAR sDir[_MAX_DIR]; TCHAR sFilename[_MAX_FNAME], sAppFilename[_MAX_FNAME]; TCHAR sExt[_MAX_EXT]; GetModuleFileName(AfxGetInstanceHandle(), sAppFilename, _MAX_FNAME); _tsplitpath_s(sAppFilename, sDrive, sDir, sFilename, sExt); m_strAppDir = CString(sDrive) + CString(sDir); m_strAppFile = CString(sFilename); m_model.setWorkDir((LPTSTR)(LPCTSTR)m_strAppDir); // 注册控件 CServoGraph::RegisterWndClass(); CVerticalLine::RegisterWndClass(); CHorizontalLine::RegisterWndClass(); CEqsGraphWnd::RegisterWndClass(); CMapPosWnd::RegisterWndClass(); CHmTab::RegisterWndClass(); // 初始化Rx库 RX_Init(); HSMS_Initialize(); // 初始化 GDI+ InitGDIPlus(); // 初始化 MFC RichEdit 控件 AfxInitRichEdit2(); // 初始化报警管理器 try { if (!AlarmManager::getInstance().initAlarmTable()) { AfxMessageBox("初始化报警管理器失败!"); return FALSE; } } catch (const std::exception& ex) { CString errorMsg; errorMsg.Format(_T("初始化报警管理器失败:%s"), CString(ex.what())); AfxMessageBox(errorMsg, MB_ICONERROR); return FALSE; } // 初始化搬运记录管理库 try { if (!TransferManager::getInstance().initTransferTable()) { AfxMessageBox("初始化搬运记录管理库设置失败!"); return FALSE; } } catch (const std::exception& ex) { CString errorMsg; errorMsg.Format(_T("初始化搬运记录管理库设置失败:%s"), CString(ex.what())); AfxMessageBox(errorMsg, MB_ICONERROR); return FALSE; } // 初始化运行日志管理库 try { if (!SystemLogManager::getInstance().initSystemLogTable()) { AfxMessageBox("初始化运行日志管理库失败!"); return FALSE; } } catch (const std::exception& ex) { CString errorMsg; errorMsg.Format(_T("初始化运行日志管理库失败:%s"), CString(ex.what())); AfxMessageBox(errorMsg, MB_ICONERROR); return FALSE; } // 初始化用户管理库 try { UserManager& userManager = UserManager::getInstance(); #if !defined(_DEBUG) userManager.initializeIdleDetection(AfxGetMainWnd()->m_hWnd); SetTimer(1, 60000, nullptr); #endif userManager.loadSession(); } catch (const std::exception& ex) { CString errorMsg; errorMsg.Format(_T("初始化用户管理库失败:%s"), CString(ex.what())); AfxMessageBox(errorMsg, MB_ICONERROR); return FALSE; } // 初始化配方管理库 try { if (!RecipeManager::getInstance().initRecipeTable()) { AfxMessageBox("初始化配方管理库失败!"); return FALSE; } } catch (const std::exception& ex) { CString errorMsg; errorMsg.Format(_T("初始化配方管理库失败:%s"), CString(ex.what())); AfxMessageBox(errorMsg, MB_ICONERROR); return FALSE; } CServoDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse == IDOK) { // TODO: 在此放置处理何时用 // “确定”来关闭对话框的代码 } else if (nResponse == IDCANCEL) { // TODO: 在此放置处理何时用 // “取消”来关闭对话框的代码 } else if (nResponse == -1) { TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n"); TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n"); } // 删除上面创建的 shell 管理器。 if (pShellManager != NULL) { delete pShellManager; } // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, // 而不是启动应用程序的消息泵。 return FALSE; } int CServoApp::ExitInstance() { CControlJobManagerDlg::FreeState(); m_model.term(); HSMS_Term(); RX_Term(); // 清理 GDI+ TermGDIPlus(); // 销毁报警表 AlarmManager::getInstance().termAlarmTable(); // 销毁搬运记录管理库 TransferManager::getInstance().termTransferTable(); // 销毁运行日志 SystemLogManager::getInstance().termSystemLogTable(); // 销毁用户表 #if !defined(_DEBUG) // 清除 UserManager 的无操作检测 UserManager::getInstance().terminateIdleDetection(); KillTimer(1); #endif // 销毁配方表 RecipeManager::getInstance().termRecipeTable(); return CWinApp::ExitInstance(); } // 初始化 GDI+ void CServoApp::InitGDIPlus() { // 初始化 GDI+ 图形库 GdiplusStartup(&g_diplusToken, &g_diplusStartupInput, NULL); } // 清理 GDI+ void CServoApp::TermGDIPlus() { // 清理 GDI+ 图形库 GdiplusShutdown(g_diplusToken); }