// DiosUnitToolsDlg.cpp: 实现文件 // #include "pch.h" #include "framework.h" #include "DiosUnitTools.h" #include "DiosUnitToolsDlg.h" #include "afxdialogex.h" #include "CGeneratorDlg.h" #include "CMechanicalDlg.h" #include "CCollimatorDlg.h" #include "CSynBoxDlg.h" #include "CDetectorDlg.h" #include "CSMachineDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif #ifndef _TOOLSINSTANCE #define _TOOLSINSTANCE #endif // CDiosUnitToolsDlg 对话框 CDiosUnitToolsDlg* CDiosUnitToolsDlg::m_Singleton = nullptr; static CString m_strLog; CDiosUnitToolsDlg::CDiosUnitToolsDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIOSUNITTOOLS_DIALOG, pParent) { InitLog(); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_Singleton = this; } CDiosUnitToolsDlg::~CDiosUnitToolsDlg() { m_Singleton = nullptr; gal_hTopWnd = nullptr; ExitLog(); } void CDiosUnitToolsDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_TAB1, m_ctrTAB_UnitList); DDX_Control(pDX, IDC_EDIT2, m_editLog); DDX_Control(pDX, IDC_EDIT1, m_editMSG); } BEGIN_MESSAGE_MAP(CDiosUnitToolsDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_MESSAGE(MSG_Dios_Notify_ModeInit, DiosModeInit) ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CDiosUnitToolsDlg::OnTcnSelchangeTab1) ON_BN_CLICKED(IDC_BUTTON1, &CDiosUnitToolsDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BUTTON2, &CDiosUnitToolsDlg::OnBnClickedButton2) ON_BN_CLICKED(IDOK, &CDiosUnitToolsDlg::OnBnClickedOk) END_MESSAGE_MAP() // CDiosUnitToolsDlg 消息处理程序 BOOL CDiosUnitToolsDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != nullptr) { BOOL bNameValid; CString strAboutMenu; bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 SetUnitConfig(); //设置全局日志接口 gal_pLogFun = &DlgLog; return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } void CDiosUnitToolsDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { //CAboutDlg dlgAbout; //dlgAbout.DoModal(); } else { CDialogEx::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CDiosUnitToolsDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CDiosUnitToolsDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } //输出日志:可供下层模块调用 void CDiosUnitToolsDlg::DlgLog(CString strlog) { //mLog::Info("DlgLog:{$}", strlog); if (m_Singleton != nullptr) { if (m_strLog.GetLength() > 5000) { m_strLog = m_strLog.Left(500); } m_strLog = m_strLog + GetTimeStr() + " " + strlog + "\r\n"; m_Singleton->m_editLog.SetWindowText(m_strLog); m_Singleton->m_editLog.LineScroll(m_Singleton->m_editLog.GetLineCount() - 1, 0); } } void CDiosUnitToolsDlg::DlgMSG(CString strKey, CString strText) { //mLog::Info("DlgMSG:{$}:strText", strKey,strText); if (m_Singleton != nullptr) { CString strMSG = GetTimeStr() + " " + strKey + ":" + strText + "\r\n"; m_Singleton->m_editMSG.SetWindowText(strMSG); m_Singleton->m_editMSG.LineScroll(m_Singleton->m_editMSG.GetLineCount() - 1, 0); } } //其它设备窗口初始化另一个设备窗口 LRESULT CDiosUnitToolsDlg::DiosModeInit(WPARAM wParam, LPARAM lParam) { Dev_Type modeType = (Dev_Type)wParam; bool act = (int)lParam; auto findDevcie = CDeviceSET::GetInstance()->m_CDeviceMap.find(modeType); if (findDevcie == CDeviceSET::GetInstance()->m_CDeviceMap.end()) { mLog::Debug("DiosModeInit: Device type[{$}] not exist", (int)modeType); return 0; } findDevcie->second->InitPageElements(act); return 0; } //设置窗口元素显示 void CDiosUnitToolsDlg::ShowPageElements(bool init, bool exit) { //init GetDlgItem(IDC_BUTTON1)->EnableWindow(init); //exit GetDlgItem(IDC_BUTTON2)->EnableWindow(exit); } //初始化 void CDiosUnitToolsDlg::SetUnitConfig() { //设置当前全局环境变量 //string envPath = GetProcessDirectory(); //envPath += "\\PlatformModule"; //AddEnvPath(envPath.c_str()); //记录当前顶层窗口句柄 gal_hTopWnd = this->m_hWnd; //初始化控件 m_ctrTAB_UnitList.ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE); //添加提示 GetDlgItem(IDC_STATIC3)->SetWindowText(_T("development for Dios")); //修改分页名称,将子窗口嵌到主窗口中,并且修改下大小 //CRect tableSize; //m_ctrTAB_UnitList.GetClientRect(&tableSize); //tableSize.top += 20; //获取tab control位置和大小 CRect tabRect, itemRect; int nX, nY, nXc, nYc; m_ctrTAB_UnitList.GetClientRect(&tabRect); m_ctrTAB_UnitList.GetItemRect(0, &itemRect); nX = itemRect.left; nY = itemRect.bottom; nXc = tabRect.right - itemRect.left; nYc = tabRect.bottom - nY; auto HW_InitWindows = [this, nX, nY, nXc, nYc](Dev_Type DevType, int DlgNum) -> void { switch (DevType) { case Dev_Generator: {CDeviceSET::GetInstance()->m_CDeviceMap[DevType].reset(new CGeneratorDlg);}break; case Dev_Mechanical: {CDeviceSET::GetInstance()->m_CDeviceMap[DevType].reset(new CMechanicalDlg); }break; case Dev_Collimator: {CDeviceSET::GetInstance()->m_CDeviceMap[DevType].reset(new CCollimatorDlg); }break; case Dev_SynBox: {CDeviceSET::GetInstance()->m_CDeviceMap[DevType].reset(new CSynBoxDlg); }break; case Dev_Detector: {CDeviceSET::GetInstance()->m_CDeviceMap[DevType].reset(new CDetectorDlg); }break; case Dev_SMachine: {CDeviceSET::GetInstance()->m_CDeviceMap[DevType].reset(new CSMachineDlg); }break; } m_ctrTAB_UnitList.InsertItem(DevType, _T(CDeviceSET::GetInstance()->m_CDeviceMap[DevType]->m_strName.c_str())); CDeviceSET::GetInstance()->m_CDeviceMap[DevType]->Create(DlgNum, &m_ctrTAB_UnitList); //m_pDlgGenerator->MoveWindow(&tableSize); CDeviceSET::GetInstance()->m_CDeviceMap[DevType]->SetWindowPos(&wndTop, nX, nY, nXc, nYc, SWP_SHOWWINDOW); //滚动条 CDialogTemplate dlTemp; SIZE szPixelsRes = { 0 }; dlTemp.Load(MAKEINTRESOURCE(DlgNum)); // 子对话框的资源 ID dlTemp.GetSizeInPixels(&szPixelsRes); //直接从资源读取对话框获取原始像素尺寸,无需分辨率转换 CDeviceSET::GetInstance()->m_CDeviceMap[DevType]->UpdateScrollInfo(0, szPixelsRes.cy); }; HW_InitWindows(Dev_Generator, IDD_DIALOG1); HW_InitWindows(Dev_Mechanical, IDD_DIALOG2); HW_InitWindows(Dev_Collimator, IDD_DIALOG3); HW_InitWindows(Dev_SynBox, IDD_DIALOG4); HW_InitWindows(Dev_Detector, IDD_DIALOG5); HW_InitWindows(Dev_SMachine, IDD_DIALOG6); SwitchTable(Dev_Type::Dev_Generator); } //初始化日志模块 bool CDiosUnitToolsDlg::InitLog() { string strLogPath = GetProcessDirectory() + UnitTool_LogPath; //Log4CPP::ThreadContext::Map::Set("LogFileName", cfgKey.c_str()); Log4CPP::GlobalContext::Map::Set(ECOM::Utility::Hash(UnitTool_LogFileName), UnitTool_LogName); auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str()); mLog::gLogger = Log4CPP::LogManager::GetLogger(UnitTool_LogName); string version; if (GetVersion(version)) { mLog::Info("===============log begin : [{$}] version:{$} ===================\n", UnitTool_LogName, version.c_str()); } else { mLog::Info("===============log begin : [{$}] version:0.0.0.0 ===================\n", UnitTool_LogName); } return true; } void CDiosUnitToolsDlg::ExitLog() { if (mLog::gLogger) { mLog::Info("===============log end ==================="); mLog::Close(); mLog::gLogger = nullptr; } } //统一切换接口 void CDiosUnitToolsDlg::SwitchTable(Dev_Type unitType) { if(Dev_Type::Dev_TypeNULL == unitType) { unitType = (Dev_Type)m_ctrTAB_UnitList.GetCurSel(); } for (auto& item : CDeviceSET::GetInstance()->m_CDeviceMap) { if(item.second->m_enuType == unitType) item.second->ShowWindow(SW_SHOW); else item.second->ShowWindow(SW_HIDE); } } //切换设备窗口 void CDiosUnitToolsDlg::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: 在此添加控件通知处理程序代码 *pResult = 0; SwitchTable(); } //创建设备窗口 void CDiosUnitToolsDlg::OnBnClickedButton1() { m_ctrTAB_UnitList.ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT1)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC2)->ShowWindow(SW_SHOW); GetDlgItem(IDC_EDIT2)->ShowWindow(SW_SHOW); GetDlgItem(IDC_STATIC3)->ShowWindow(SW_HIDE); CDeviceSET::GetToolDefaultConfig(); ShowPageElements(FALSE, TRUE); } //关闭设备窗口 void CDiosUnitToolsDlg::OnBnClickedButton2() { m_ctrTAB_UnitList.ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC2)->ShowWindow(SW_HIDE); GetDlgItem(IDC_EDIT2)->ShowWindow(SW_HIDE); GetDlgItem(IDC_STATIC3)->ShowWindow(SW_SHOW); CDeviceSET::SetToolDefaultConfig(); ShowPageElements(TRUE, FALSE); } //保存并退出 void CDiosUnitToolsDlg::OnBnClickedOk() { CDeviceSET::SetToolDefaultConfig(); CDialogEx::OnOK(); }