// 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) { } CRecipeDeviceBindDlg::~CRecipeDeviceBindDlg() { } void CRecipeDeviceBindDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CRecipeDeviceBindDlg, CDialogEx) ON_WM_CLOSE() ON_WM_SIZE() END_MESSAGE_MAP() // CRecipeDeviceBindDlg 消息处理程序 BOOL CRecipeDeviceBindDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 // 设置固定大小(例如 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 }); } 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: 在此处添加消息处理程序代码 }