// CPageDataVarialbles.cpp: 实现文件 // #include "stdafx.h" #include "Servo.h" #include "CPageDataVarialbles.h" #include "afxdialogex.h" #include "CVariableEditDlg2.h" IMPLEMENT_DYNAMIC(CPageDataVarialbles, CHMPropertyPage) CPageDataVarialbles::CPageDataVarialbles(CWnd* pParent /*=nullptr*/) : CHMPropertyPage(IDD_PAGE_VARIABLE, pParent) { } CPageDataVarialbles::~CPageDataVarialbles() { } void CPageDataVarialbles::DoDataExchange(CDataExchange* pDX) { CHMPropertyPage::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_listCtrl); } BEGIN_MESSAGE_MAP(CPageDataVarialbles, CHMPropertyPage) ON_WM_CTLCOLOR() ON_WM_DESTROY() ON_WM_SIZE() ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CPageDataVarialbles::OnLvnItemchangedList1) END_MESSAGE_MAP() BOOL CPageDataVarialbles::OnInitDialog() { CHMPropertyPage::OnInitDialog(); // 读出列宽(独立的 ini 分节,避免与 SVID 页面冲突) CString strIniFile, strItem; strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); int width[8] = { 0, 218, 180, 180, 180, 180, 180, 180 }; for (int i = 0; i < 8; i++) { strItem.Format(_T("Col_%d_Width"), i); width[i] = GetPrivateProfileInt("PageDataVariableListCtrl", strItem, width[i], strIniFile); } DWORD dwStyle = m_listCtrl.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT; dwStyle |= LVS_EX_GRIDLINES; m_listCtrl.SetExtendedStyle(dwStyle); HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1); ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL); m_listCtrl.InsertColumn(0, _T(""), LVCFMT_RIGHT, width[0]); m_listCtrl.InsertColumn(1, _T("DV ID"), LVCFMT_LEFT, width[1]); m_listCtrl.InsertColumn(2, _T("DV Name"), LVCFMT_LEFT, width[2]); m_listCtrl.InsertColumn(3, _T("DV Format"), LVCFMT_LEFT, width[3]); m_listCtrl.InsertColumn(4, _T("DV Remark"), LVCFMT_LEFT, width[4]); loadDataVariables(); return TRUE; } HBRUSH CPageDataVarialbles::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { return CHMPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor); } void CPageDataVarialbles::OnDestroy() { CHMPropertyPage::OnDestroy(); // 保存列宽 CString strIniFile, strItem, strTemp; strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir); CHeaderCtrl* pHeader = m_listCtrl.GetHeaderCtrl(); for (int i = 0; i < pHeader->GetItemCount(); i++) { RECT rect; pHeader->GetItemRect(i, &rect); strItem.Format(_T("Col_%d_Width"), i); strTemp.Format(_T("%d"), rect.right - rect.left); WritePrivateProfileString("PageDataVariableListCtrl", strItem, strTemp, strIniFile); } } void CPageDataVarialbles::OnSize(UINT nType, int cx, int cy) { CHMPropertyPage::OnSize(nType, cx, cy); if (GetDlgItem(IDC_LIST1) == nullptr) return; CRect rcClient; GetClientRect(&rcClient); m_listCtrl.MoveWindow(12, 12, rcClient.Width() - 24, rcClient.Height() - 24); } void CPageDataVarialbles::OnApply() { __super::OnApply(); } void CPageDataVarialbles::loadDataVariables() { auto& dvars = theApp.m_model.m_hsmsPassive.getDataVariables(); for (auto item : dvars) { int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), _T("")); m_listCtrl.SetItemData(index, (DWORD_PTR)item); m_listCtrl.SetItemText(index, 1, std::to_string(item->getVarialbleId()).c_str()); m_listCtrl.SetItemText(index, 2, item->getName().c_str()); m_listCtrl.SetItemText(index, 3, SERVO::CVariable::formatToString(item->getFormat()).c_str()); m_listCtrl.SetItemText(index, 4, item->getRemark().c_str()); } } void CPageDataVarialbles::OnCreateBtns() { const int BTN_W = 80; const int BTN_H = 28; CreateBtn(_T("新增"), BTN_W, BTN_H, 1001); CreateBtn(_T("删除"), BTN_W, BTN_H, 1002)->EnableWindow(FALSE); CreateBtn(_T("编辑"), BTN_W, BTN_H, 1003)->EnableWindow(FALSE); } void CPageDataVarialbles::OnLvnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); int nSelCount = m_listCtrl.GetSelectedCount(); if (CButton* pDel = GetBtnByName("删除")) { pDel->EnableWindow(nSelCount > 0); } if (CButton* pEdit = GetBtnByName("编辑")) { pEdit->EnableWindow(nSelCount > 0); } *pResult = 0; } void CPageDataVarialbles::OnClickedBtn(const char* btnName) { ASSERT(btnName); if (_strcmpi(btnName, "新增") == 0) { int rc = UX_CanExecute(L"addVarialbles"); if (rc != 1) { AfxMessageBox("操作权限不足,请联系管理人员!"); return; } unsigned int newId = theApp.m_model.m_hsmsPassive.getMaxDataVariableId(); int newIdInt = static_cast(newId + 1); CVariableEditDlg2 dlg(_T("新增数据变量"), newIdInt, _T("U1"), _T(""), _T(""), this); if (dlg.DoModal() != IDOK) return; CString name = dlg.GetNameText(); CString fmt = dlg.GetTypeText(); CString remark = dlg.GetRemark(); int ret = theApp.m_model.m_hsmsPassive.addDataVariable(CT2A(name), CT2A(fmt), CT2A(remark), newIdInt); if (ret == 0) { UX_RecordAction(L"addVarialbles"); m_listCtrl.DeleteAllItems(); loadDataVariables(); } else { AfxMessageBox(_T("新增数据变量失败,格式是否正确?(U1/U2/I2/A20/A50/L)")); } } else if (_strcmpi(btnName, "删除") == 0) { POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); if (pos == nullptr) return; int nItem = m_listCtrl.GetNextSelectedItem(pos); auto pVar = reinterpret_cast(m_listCtrl.GetItemData(nItem)); if (pVar == nullptr) return; int rc = UX_CanExecute(L"delVarialbles"); if (rc != 1) { AfxMessageBox("操作权限不足,请联系管理人员!"); return; } int ret = theApp.m_model.m_hsmsPassive.deleteDataVariable(static_cast(pVar->getVarialbleId())); if (ret == 0) { UX_RecordAction(L"delVarialbles"); m_listCtrl.DeleteAllItems(); loadDataVariables(); if (CButton* pDel = GetBtnByName("删除")) pDel->EnableWindow(FALSE); if (CButton* pEdit = GetBtnByName("编辑")) pEdit->EnableWindow(FALSE); } } else if (_strcmpi(btnName, "编辑") == 0) { POSITION pos = m_listCtrl.GetFirstSelectedItemPosition(); if (pos == nullptr) return; int nItem = m_listCtrl.GetNextSelectedItem(pos); auto pVar = reinterpret_cast(m_listCtrl.GetItemData(nItem)); if (pVar == nullptr) return; int rc = UX_CanExecute(L"editVarialbles"); if (rc != 1) { AfxMessageBox("操作权限不足,请联系管理人员!"); return; } CVariableEditDlg2 dlg(_T("编辑数据变量"), pVar->getVarialbleId(), CString(CA2T(SERVO::CVariable::formatToString(pVar->getFormat()).c_str())), CString(CA2T(pVar->getName().c_str())), CString(CA2T(pVar->getRemark().c_str())), this); if (dlg.DoModal() != IDOK) return; CString name = dlg.GetNameText(); CString fmt = dlg.GetTypeText(); CString remark = dlg.GetRemark(); int ret = theApp.m_model.m_hsmsPassive.updateDataVariable(static_cast(pVar->getVarialbleId()), CT2A(name), CT2A(fmt), CT2A(remark)); if (ret == 0) { UX_RecordAction(L"editVarialbles"); m_listCtrl.DeleteAllItems(); loadDataVariables(); } else { AfxMessageBox(_T("编辑数据变量失败,格式是否正确?(U1/U2/I2/A20/A50/L)")); } } }