/************************************************************************************************** 版本所有(C), 2020-2022, 北京普达迪泰 *************************************************************************************************** 文 件 名: StartView.cpp: 功能描述: “开始”UI 版 本 号: 1.00初版 作 者: HYF 生成日期; 2021-12-20 最近修改: 函数列表: 修改历史: 1.日 期 :2021-12-20 作 者 : HYF 修改内容 : 创建文件 **************************************************************************************************/ #include "pch.h" #include "MainFrm.h" // SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的 // ATL 项目中进行定义,并允许与该项目共享文档代码。 #ifndef SHARED_HANDLERS #include "Dms.h" #endif #include "resource.h" #include "DmsDoc.h" #include "StartView.h" #include "EquipTypeView.h" #include "EquipTypeManager.h" #include "ReportView.h" #include "TaskManager.h" #include "CppSQLite3.h" #include "StaticReport.h" #include "DynamicReport.h" #include "Task.h" #include "IPNDlg.h" #include "GuideDlg.h" #include "DictView.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 秒定时器:用于显示当前时间 #define TIMER_NOW 100 // CStartView IMPLEMENT_DYNCREATE(CStartView, CFormView) BEGIN_MESSAGE_MAP(CStartView, CFormView) ON_BN_CLICKED(IDC_BTN_START, &CStartView::OnBnClickedBtnStart) ON_WM_TIMER() ON_BN_CLICKED(IDC_RADIO_TASK_TYPE1, &CStartView::OnBnClickedRadioTaskType1) ON_BN_CLICKED(IDC_RADIO_TASK_TYPE2, &CStartView::OnBnClickedRadioTaskType2) ON_STN_CLICKED(IDC_STATIC_EQUIPMENT, &CStartView::OnStnClickedStaticEquipment) ON_STN_CLICKED(IDC_STATIC_REPORT, &CStartView::OnStnClickedStaticReport) ON_NOTIFY(NM_DBLCLK, IDC_CUSTOM_GRID_CTRL, OnDBRecentTaskClick) ON_WM_CREATE() ON_STN_CLICKED(IDC_STATIC_REL_GUIDE, &CStartView::OnStnClickedStaticRelGuide) ON_STN_CLICKED(IDC_STATIC_REL_FNL, &CStartView::OnStnClickedStaticRelFnl) ON_WM_CTLCOLOR() ON_STN_CLICKED(IDC_STATIC_CONFIG, &CStartView::OnStnClickedDictConfig) END_MESSAGE_MAP() // CStartView 构造/析构 CStartView::CStartView() : CFormView(IDD_VIEW_START) ,m_iTaskType(0) , m_szEquipCode(_T("")) , m_szTaskDesc(_T("")) { m_BkBrush.CreateSolidBrush(RGB(247, 247, 247)); } CStartView::~CStartView() { } void CStartView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATIC_START_TITLE, m_Static_Title); DDX_Control(pDX, IDC_STATIC_TASK_TITLE, m_Static_TaskTitle); DDX_Control(pDX, IDC_COMBO_EQUIPMENT_TYPE, m_Combo_EquipmentType); DDX_Control(pDX, IDC_STATIC_EQUIPMENT, m_Static_EquipmentFunc); DDX_Control(pDX, IDC_STATIC_REPORT, m_Static_ReportFunc); DDX_Control(pDX, IDC_STATIC_DECLARATION, m_Static_Support); DDX_Radio(pDX, IDC_RADIO_TASK_TYPE1, m_iTaskType); DDX_Control(pDX, IDC_STATIC_RELATED, m_Static_Related); DDX_Text(pDX, IDC_EDT_EQUIP_CODE, m_szEquipCode); DDX_Text(pDX, IDC_EDIT_TASK_DESC, m_szTaskDesc); DDX_Control(pDX, IDC_CUSTOM_GRID_CTRL, m_GridCtrl); DDX_Control(pDX, IDC_STATIC_RECENT, m_Static_Recent); DDX_Control(pDX, IDC_STATIC_REL_GUIDE, m_Label_Rel_Guide); DDX_Control(pDX, IDC_STATIC_REL_FNL, m_Label_Rel_Fnl); DDX_Control(pDX, IDC_STATIC_CONFIG, m_Static_Ctrl_Dict); } BOOL CStartView::PreCreateWindow(CREATESTRUCT& cs) { // CREATESTRUCT cs 来修改窗口类或样式 return CFormView::PreCreateWindow(cs); } /************************************************************************************************** 函 数 名 :OnCreate 功能描述 :消息处理-Create 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ int CStartView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFormView::OnCreate(lpCreateStruct) == -1) return -1; m_pDoc = (CDmsDoc *)GetDocument(); ASSERT(m_pDoc != NULL); ASSERT(m_pDoc->IsKindOf(RUNTIME_CLASS(CDmsDoc))); return 0; } /************************************************************************************************** 函 数 名 :OnInitialUpdate 功能描述 :初始化UI显示 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::OnInitialUpdate() { CFormView::OnInitialUpdate(); // 设置界面显示的文字样式 m_Static_Title.SetFontSize(28); m_Static_Title.SetFontBold(TRUE); // 根据条件启动任务 m_Static_TaskTitle.SetFontSize(18); m_Static_TaskTitle.SetFontBold(TRUE); // 技术支持 m_Static_Support.SetTextColor(RGB(42, 130, 228)); m_Static_Support.SetFontSize(14); // 相关功能 m_Static_Related.SetFontSize(16); m_Static_Related.SetFontBold(TRUE); // 设备管理 m_Static_EquipmentFunc.SetFontSize(13); m_Static_EquipmentFunc.SetLink(TRUE); m_Static_EquipmentFunc.SetTextColor(RGB(42, 130, 228)); m_Static_EquipmentFunc.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_HAND_CURSOR)); // 测量报告 m_Static_ReportFunc.SetFontSize(13); m_Static_ReportFunc.SetLink(TRUE); m_Static_ReportFunc.SetTextColor(RGB(42, 130, 228)); m_Static_ReportFunc.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_HAND_CURSOR)); // 测量引导 m_Label_Rel_Guide.SetFontSize(13); m_Label_Rel_Guide.SetLink(TRUE); m_Label_Rel_Guide.SetTextColor(RGB(42, 130, 228)); m_Label_Rel_Guide.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_HAND_CURSOR)); // 网形优化 m_Label_Rel_Fnl.SetFontSize(13); m_Label_Rel_Fnl.SetLink(TRUE); m_Label_Rel_Fnl.SetTextColor(RGB(42, 130, 228)); m_Label_Rel_Fnl.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_HAND_CURSOR)); // 网形优化 m_Static_Ctrl_Dict.SetFontSize(13); m_Static_Ctrl_Dict.SetLink(TRUE); m_Static_Ctrl_Dict.SetTextColor(RGB(42, 130, 228)); m_Static_Ctrl_Dict.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_HAND_CURSOR)); // 启动定时器 SetTimer(TIMER_NOW, 1000, NULL); // 最近任务 m_Static_Recent.SetFontSize(16); m_Static_Recent.SetFontBold(TRUE); // 初始化UI数据; this->InitFormData(); // 更新UI显示 GetParentFrame()->RecalcLayout(); ResizeParentToFit(); // 更改GridCtrl风格 ::SetWindowLong(m_GridCtrl.m_hWnd, GWL_STYLE, GetWindowLong(m_GridCtrl.m_hWnd, GWL_STYLE)&~WS_BORDER); // 初始化设备型号下拉选择 InitEquipTypeList(); } /************************************************************************************************** 函 数 名 :InitFormData 功能描述 :初始化UI数据 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::InitFormData() { // 初始化“最近任务” InitRecentTaskList(); } /************************************************************************************************** 函 数 名 :ResetFormData 功能描述 :重置UI展示数据 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::ResetFormData() { } /************************************************************************************************** 函 数 名 :InitEquipTypeList 功能描述 :初始化设备型号下拉选择列表 输出参数 :无 返 回 值 :CppSQLite3Query **************************************************************************************************/ void CStartView::InitEquipTypeList() { m_Combo_EquipmentType.ResetContent(); EquipTypeManager *pManager = m_pDoc->GetEquipTypeManager(); CppSQLite3Query q = pManager->Query(); bool bFlag = q.eof(); while (!q.eof()) { CString szEquipTypeCode = q.getStringField("equip_type_code"); m_Combo_EquipmentType.AddString(szEquipTypeCode); q.nextRow(); } q.finalize(); if (!bFlag) m_Combo_EquipmentType.SetCurSel(0); } // CStartView 诊断 #ifdef _DEBUG void CStartView::AssertValid() const { CFormView::AssertValid(); } void CStartView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif //_DEBUG /************************************************************************************************** 函 数 名 :OnUpdate 功能描述 :数据变更,更新UI 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::OnUpdate(CView* /*pSender*/, LPARAM /*lHint*/, CObject* /*pHint*/) { this->InitEquipTypeList(); } /************************************************************************************************** 函 数 名 :OnTimer 功能描述 :定时器消息处理 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::OnTimer(UINT_PTR nIDEvent) { CTime tTime = CTime::GetCurrentTime(); switch (nIDEvent) { case TIMER_NOW: m_szTimeNow = tTime.Format(_T("%Y-%m-%d %H:%M:%S")); break; } CFormView::OnTimer(nIDEvent); } // 事件处理:设置任务测量类型为:0 静态测量 void CStartView::OnBnClickedRadioTaskType1() { m_iTaskType = 0; } // 事件处理: 设置任务测量类型为:1 动态测量 void CStartView::OnBnClickedRadioTaskType2() { m_iTaskType = 1; } /************************************************************************************************** 函 数 名 :OnBnClickedBtnStart 功能描述 :事件处理-启动任务 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::OnBnClickedBtnStart() { this->UpdateData(TRUE); int idx = m_Combo_EquipmentType.GetCurSel(); CString szEquipTypeCode; m_Combo_EquipmentType.GetLBText(idx, szEquipTypeCode); if (szEquipTypeCode.IsEmpty()) { MessageBox(_T("设备型号不能为空")); return; } if (m_szEquipCode.IsEmpty()) { MessageBox(_T("设备编号不能为空")); return; } TaskManager* taskManager = m_pDoc->GetTaskManager(); // 采用64位时间戳作为任务ID CTime tm; tm = CTime::GetCurrentTime();//获取系统日期 CString szTaskTime = tm.Format("%Y-%m-%d %H:%M:%S"); CString szTaskTitle; if (m_iTaskType == 0) szTaskTitle.Format("%s-%s", m_szEquipCode, _T("零位测量")); else szTaskTitle.Format("%s-%s", m_szEquipCode, _T("位姿测量")); Task task; task.SetTaskTime(szTaskTime); task.SetEquipTypeCode(szEquipTypeCode); task.SetEquipCode(m_szEquipCode); task.SetTaskTitle(szTaskTitle); task.SetTaskDesc(m_szTaskDesc); task.SetTaskType(m_iTaskType); DWORD taskId = taskManager->Add(task); if (taskId <= 0) { MessageBox(_T("任务启动失败!")); return; } CMainFrame *pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd; if (m_iTaskType == 0) ::PostMessage(pMain->m_hWnd, WM_START_STATIC, (WPARAM)taskId, NULL); else ::PostMessage(pMain->m_hWnd, WM_START_DYNAMIC, (WPARAM)taskId, NULL); } /************************************************************************************************** 函 数 名 :OnStnClickedStaticEquipment 功能描述 :事件处理-打开设备管理 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::OnStnClickedStaticEquipment() { EquipTypeView dlg; if (dlg.DoModal() == IDOK) { } } /************************************************************************************************** 函 数 名 :OnStnClickedStaticEquipment 功能描述 :事件处理--打开测量报告 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::OnStnClickedStaticReport() { ReportView dlg; if (dlg.DoModal() == IDOK) { } } /************************************************************************************************** 函 数 名 :InitRecentTaskList 功能描述 :最近任务 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::InitRecentTaskList() { m_GridCtrl.DeleteAllItems(); m_GridCtrl.SetGridLines(GVL_NONE); m_GridCtrl.SetEditable(FALSE); m_GridCtrl.SetSingleRowSelection(TRUE); m_GridCtrl.SetFrameFocusCell(FALSE); m_GridCtrl.SetSingleColSelection(FALSE); m_GridCtrl.EnableHiddenColUnhide(TRUE); m_GridCtrl.GetDefaultCell(FALSE, FALSE)->SetBackClr(RGB(247, 247, 247)); m_GridCtrl.SetBkColor(RGB(247, 247, 247)); m_GridCtrl.SetAutoSizeStyle(); TRY { m_GridCtrl.SetRowCount(20); m_GridCtrl.SetColumnCount(3); m_GridCtrl.SetFixedRowCount(0); m_GridCtrl.SetFixedColumnCount(0); m_GridCtrl.SetColumnWidth(0, 30); m_GridCtrl.SetColumnWidth(1, 160); m_GridCtrl.SetColumnWidth(2, 130); } CATCH(CMemoryException, e) { e->ReportError(); return; } END_CATCH // Get the font CFont* pFont = m_GridCtrl.GetFont(); LOGFONT lf; pFont->GetLogFont(&lf); // Make it true-type memcpy(lf.lfFaceName, _T("Arial"), 6); // Set the fixed row defaults as this new font m_GridCtrl.GetDefaultCell(TRUE, FALSE)->SetFont(&lf); CString str; /** GV_ITEM ItemTitle; ItemTitle.mask = GVIF_TEXT | GVIF_FORMAT; ItemTitle.nBorder = GVIS_BDR_BOTTOM; ItemTitle.nFormat = DT_SINGLELINE | DT_VCENTER; ItemTitle.row = 0; ItemTitle.col = 0; ItemTitle.nFormat |= DT_CENTER; ItemTitle.strText = _T("序号"); m_GridCtrl.SetItem(&ItemTitle); ItemTitle.row = 0; ItemTitle.col = 1; ItemTitle.nFormat |= DT_CENTER; ItemTitle.strText = _T("测量任务"); m_GridCtrl.SetItem(&ItemTitle); ItemTitle.row = 0; ItemTitle.col = 2; ItemTitle.nFormat |= DT_CENTER; ItemTitle.strText = _T("测量时间"); m_GridCtrl.SetItem(&ItemTitle); **/ // POINT数据访问入口 TaskManager *pTaskManager = m_pDoc->GetTaskManager(); ASSERT(pTaskManager != NULL); GV_ITEM Item; Item.mask = GVIF_TEXT | GVIF_FORMAT; Item.nFormat = DT_SINGLELINE | DT_VCENTER; int iRow = 0; int iIndex = 0; CppSQLite3Query q = pTaskManager->QueryByRecent(); while (!q.eof()) { iIndex += 1; // 序号 Item.row = iRow; Item.col = 0; Item.nFormat |= DT_CENTER; str.Format("%d", iIndex); Item.strText = str; m_GridCtrl.SetItem(&Item); LPARAM taskId = (LPARAM)q.getIntField("task_id"); m_GridCtrl.SetItemData(iRow, 0, (LPARAM)taskId); // 任务名称 Item.row = iRow; Item.col = 1; Item.nFormat |= DT_CENTER; str.Format("%s", q.getStringField("task_title")); Item.strText = str; m_GridCtrl.SetItem(&Item); DWORD taskType = q.getIntField("task_type"); m_GridCtrl.SetItemData(iRow, 1, (LPARAM)taskType); // 执行时间 Item.row = iRow; Item.col = 2; Item.nFormat |= DT_CENTER; str.Format("%s", q.getStringField("task_time")); Item.strText = str; m_GridCtrl.SetItem(&Item); iRow++; q.nextRow(); } q.finalize(); m_GridCtrl.ShowScrollBar(SB_BOTH, FALSE); //m_GridCtrl.AutoFill(); } /************************************************************************************************** 函 数 名 :OnStnClickedStaticRelGuide 功能描述 :测量引导 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::OnStnClickedStaticRelGuide() { GuideDlg dlg; dlg.DoModal(); } /************************************************************************************************** 函 数 名 :OnStnClickedStaticRelFnl 功能描述 :网形优化 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::OnStnClickedStaticRelFnl() { IPNDlg dlg; dlg.DoModal(); } /************************************************************************************************** 函 数 名 :OnDBRecentTaskClick 功能描述 :最近任务详情 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::OnDBRecentTaskClick(NMHDR *pNMHDR, LRESULT *pResult) { NM_GRIDVIEW *pItem = (NM_GRIDVIEW *)pNMHDR; CString s; int iRow = pItem->iRow; int iCol = pItem->iColumn; DWORD taskId = (DWORD)m_GridCtrl.GetItemData(iRow, 0); DWORD taskType = (DWORD)m_GridCtrl.GetItemData(iRow, 1); if (taskType == 0) { StaticReport dlg1(this, taskId); dlg1.DoModal(); } else { DynamicReport dlg2(this, taskId); dlg2.DoModal(); } } HBRUSH CStartView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor); switch (nCtlColor) { case CTLCOLOR_DLG: hbr = m_BkBrush; break; case CTLCOLOR_STATIC: hbr = m_BkBrush; break; } return hbr; } /************************************************************************************************** 函 数 名 :OnStnClickedDictConfig 功能描述 :“其它配置”用于配置数据字典 输入参数 :无 输出参数 :无 返 回 值 :void **************************************************************************************************/ void CStartView::OnStnClickedDictConfig() { DictView dlg(this); dlg.DoModal(); }