// RecipeDeviceBindDlg.cpp: 实现文件 // #include "stdafx.h" #include "Servo.h" #include "afxdialogex.h" #include "RecipeDeviceBindDlg.h" #include "RecipeManager.h" #include "Common.h" #define IDC_EDIT_DEVICEID_BASE 3000 #define IDC_EDIT_DEVICENAME_BASE 3050 #define IDC_COMBO_RECIPEID_BASE 3100 // 绑定界面需要显示的设备 static const std::vector g_vecBindDevices = { { EQ_ID_VACUUMBAKE, EQ_NAME_VACUUMBAKE }, { EQ_ID_Bonder1, EQ_NAME_BONDER1 }, { EQ_ID_Bonder2, EQ_NAME_BONDER2 }, { EQ_ID_BAKE_COOLING, EQ_NAME_BAKE_COOLING }, { EQ_ID_MEASUREMENT, EQ_NAME_MEASUREMENT }, { EQ_ID_EFEM, EQ_NAME_EFEM } }; // CRecipeDeviceBindDlg 对话框 IMPLEMENT_DYNAMIC(CRecipeDeviceBindDlg, CDialogEx) CRecipeDeviceBindDlg::CRecipeDeviceBindDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_DIALOG_RECIPE_DEVICE_BIND, pParent) , m_strPPID(_T("")) , m_strDesc(_T("")) { } CRecipeDeviceBindDlg::~CRecipeDeviceBindDlg() { } const RecipeInfo& CRecipeDeviceBindDlg::GetRecipeInfo() const { return m_recipe; } void CRecipeDeviceBindDlg::SetRecipeInfo(const RecipeInfo& info) { m_recipe = info; } void CRecipeDeviceBindDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_PPID, m_strPPID); DDX_Text(pDX, IDC_EDIT_DESC, m_strDesc); } BEGIN_MESSAGE_MAP(CRecipeDeviceBindDlg, CDialogEx) ON_WM_CLOSE() ON_WM_SIZE() ON_BN_CLICKED(IDOK, &CRecipeDeviceBindDlg::OnBnClickedOk) END_MESSAGE_MAP() // CRecipeDeviceBindDlg 消息处理程序 BOOL CRecipeDeviceBindDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 if (m_recipe.vecDeviceList.empty()) { SetWindowText(_T("新建配方")); // 设置固定大小(例如 600x400) SetWindowPos(nullptr, 0, 0, 600, 400, SWP_NOMOVE | SWP_NOZORDER); // 创建控件 const int totalControlWidth = 340; CRect clientRect; GetClientRect(&clientRect); int xStart = (clientRect.Width() - totalControlWidth) / 2; const int nRowHeight = 30; const int yStart = 30; // 顶部起始高度 const int nRowCount = static_cast(g_vecBindDevices.size()); for (int i = 0; i < nRowCount; ++i) { int y = yStart + i * nRowHeight; const auto& meta = g_vecBindDevices[i]; CEdit* pEditID = new CEdit(); pEditID->Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(xStart, y, xStart + 100, y + 25), this, IDC_EDIT_DEVICEID_BASE + i); CString strID; strID.Format(_T("%d"), meta.nDeviceID); pEditID->SetWindowText(strID); pEditID->SetReadOnly(TRUE); // 设备ID只读 CEdit* pEditName = new CEdit(); pEditName->Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect(xStart + 110, y, xStart + 210, y + 25), this, IDC_EDIT_DEVICENAME_BASE + i); pEditName->SetWindowText(CA2T(meta.strDeviceName)); pEditName->SetReadOnly(TRUE); // 设备名称只读 CComboBox* pCombo = new CComboBox(); pCombo->Create(WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST, CRect(xStart + 220, y, xStart + 340, y + 300), this, IDC_COMBO_RECIPEID_BASE + i); // 添加选项到 ComboBox m_vecDevices.push_back({ pEditID, pEditName, pCombo }); } } else { SetWindowText(_T("编辑配方")); m_strPPID = CA2T(m_recipe.strPPID.c_str()); m_strDesc = CA2T(m_recipe.strDescription.c_str()); UpdateData(FALSE); // 设置设备行数据 for (size_t i = 0; i < m_recipe.vecDeviceList.size() && i < m_vecDevices.size(); ++i) { const DeviceRecipe& d = m_recipe.vecDeviceList[i]; CString str; // 设置设备ID和名称 str.Format(_T("%d"), d.nDeviceID); m_vecDevices[i].editDeviceID->SetWindowText(str); str.Format(_T("%s"), d.strDeviceName.c_str()); m_vecDevices[i].editDeviceName->SetWindowText(str); /*ComboBox选择配方ID,后面需要修改****/ //int nCount = m_vecDevices[i].comboRecipeID->GetCount(); //for (int idx = 0; idx < nCount; ++idx) { // if ((int)m_vecDevices[i].comboRecipeID->GetItemData(idx) == d.nRecipeID) { // m_vecDevices[i].comboRecipeID->SetCurSel(idx); // break; // } //} } } return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CRecipeDeviceBindDlg::OnClose() { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDialogEx::OnClose(); // 清理控件 for (auto& device : m_vecDevices) { if (device.editDeviceID) { device.editDeviceID->DestroyWindow(); delete device.editDeviceID; } if (device.editDeviceName) { device.editDeviceName->DestroyWindow(); delete device.editDeviceName; } if (device.comboRecipeID) { device.comboRecipeID->DestroyWindow(); delete device.comboRecipeID; } } m_vecDevices.clear(); } void CRecipeDeviceBindDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 } void CRecipeDeviceBindDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); // 收集所有设备映射 m_recipe.vecDeviceList.clear(); for (const auto& dev : m_vecDevices) { DeviceRecipe info; CString strID, strName; dev.editDeviceID->GetWindowText(strID); dev.editDeviceName->GetWindowText(strName); int sel = dev.comboRecipeID->GetCurSel(); info.nRecipeID = -1; if (sel != CB_ERR) { info.nRecipeID = (int)dev.comboRecipeID->GetItemData(sel); } info.nDeviceID = _ttoi(strID); info.strDeviceName = CT2A(strName); m_recipe.vecDeviceList.push_back(info); } // 检查 PPID 是否为空 if (m_strPPID.IsEmpty()) { AfxMessageBox(_T("配方 PPID 不能为空")); return; } // PPID和描述 m_recipe.strPPID = CT2A(m_strPPID); m_recipe.strDescription = CT2A(m_strDesc); CDialogEx::OnOK(); }